Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.01.01;
Скачать: CL | DM;

Вниз

Конструкторы   Найти похожие ветки 

 
dapher   (2005-12-15 14:16) [0]

Вопрос теоретического плана. Если назвать конструктор не словом Create а другим, что нить плохое произойдет? будет ли это вообще работать? если да, то как?
Спасибо.


 
Digitman ©   (2005-12-15 14:20) [1]


> Если назвать конструктор не словом Create а другим, что
> нить плохое произойдет?


ничего плохого не произойдет

обзови его хоть валенком, лишь бы компилятор знал, что речь идет именно о конструирующем методе класса


> будет ли это вообще работать? если да, то как?


будет работать точно так же как любой иной конструктор с любым иным именем метода


 
alex_*** ©   (2005-12-15 14:25) [2]

а как сказать компилеру что метод ххх есть конструктор? по-моему конструтор в дельфи может только Create называться


 
DesWind ©   (2005-12-15 14:30) [3]


> alex_*** ©   (15.12.05 14:25) [2]

Зарезервированое слово constructor


 
Игорь Шевченко ©   (2005-12-15 14:38) [4]

type
 TBar = class
 .....
 public
   constructor Foo;
 end;

...
constructor TBar.Foo;
begin
 inherited Create;
 ...
end;

var
 Bar: TBar;

Bar := Bar.Foo;


 
dapher   (2005-12-15 14:45) [5]

Понятно, спасибо...
А вот в каких случаях он вообще не нужен?


 
TUser ©   (2005-12-15 14:48) [6]


> А вот в каких случаях он вообще не нужен?

Конструктор?


 
dapher   (2005-12-15 14:50) [7]

да, именно он.. =)


 
Digitman ©   (2005-12-15 14:52) [8]


> в каких случаях он вообще не нужен?


в тех случаях, когда в ходе конструирования объекта не требуется явная инициализация его данных

например,

TMyClass = class(..)
 FSomeField: TSomeType;
..
 constructor Valenok;  
end;

constructor TMyClass.Valenok;
begin
 ...
 FSomeField := SomeValue; //явная инициализация поля FSomeField
 ...
end;


 
PVOzerski ©   (2005-12-15 14:56) [9]

1) Если нет классов :). Например, если вместо классов используются объекты стиля Turbo Pascal, а все методы статические;
2) Если все методы в классе объявлены как class procedure или class function, полей нет вообще, а обращение к методам идет не через переменную типа "данный класс", а напрямую.


 
Deka ©   (2005-12-15 15:15) [10]

Насколько я помню, после создания все поля обнуляются и поэтому если такие нулевые значения устраивают - конструктор не нужен. Но это частный случай [8].


 
dapher   (2005-12-15 15:20) [11]

вот если я создаю такой вот класс:

TMyClass = class
 FSomeField1: TSomeType1;
 FSomeField2: TSomeType2;

 procedure SomeMethod;
end;

нужен конструктор? я так понимаю, что не нужен... или все-таки?
могу ли использовать вот так:

procedure SomeProc;
var
 obj: TMyClass;
begin
 obj.FSomeField1:=SomeValue;
 obj.SomeMethod;
end;


 
PVOzerski ©   (2005-12-15 15:21) [12]

Осмелюсь напомнить, что переменная типа класс до присвоения ей чего-либо - nil или мусор. А присвоение бывает либо результата вызова конструктора, либо значения другой переменной (но тогда онабудет ссылаться на те же самые данные), либо это какие-то трюки, мало пригодные к рекомендованию.


 
PVOzerski ©   (2005-12-15 15:25) [13]

2dapher: так присваивать нельзя. Другое дело, что ты не обязан свой конструктор описывать. Всякий класс - по умолчанию наследник TObject, который имеет предопределенный метод Create. Если тебя он устраивает - вызывай его. Равно как у тебя уже есть деструктор Destroy и метод Free.

procedure SomeProc;
var
obj: TMyClass;
begin
obj := TMyClass.Create; //здесь вызовется конструктор, унаследованный от TObject
obj.FSomeField1:=SomeValue;
obj.SomeMethod;
obj.Free;
end;


 
Джо ©   (2005-12-15 15:27) [14]

Главное, деструктор Destroy"ем назвать.


 
dapher   (2005-12-15 15:31) [15]

"Всякий класс - по умолчанию наследник TObject" - теперь все понятно! =) большое спасибо!


 
PVOzerski ©   (2005-12-15 15:32) [16]

2Джо: это важно, только если ты используешь стандартный Free. Тогда, кстати, Destroy еще и надо обязательно объявлять Override.


 
Anatoly Podgoretsky ©   (2005-12-15 15:51) [17]

Если класс является компонентом, помещаемым на палитру, то при этом автоматически будет вызываться конструктор с именем Create



Страницы: 1 вся ветка

Текущий архив: 2006.01.01;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.027 c
14-1133890435
Хинт
2005-12-06 20:33
2006.01.01
Выбор Delphi


8-1122266318
Sankez
2005-07-25 08:38
2006.01.01
Как можно проиграть avi на рабочем столе ?


1-1133517420
DimLord
2005-12-02 12:57
2006.01.01
Вывод данных таблиц ы на печать


2-1134650804
fast2
2005-12-15 15:46
2006.01.01
Как создать директорию вместе с родительскими директориями?


14-1134199739
saNat
2005-12-10 10:28
2006.01.01
Реализация алгоритма решения сист. лин. уравнений методом Гаусса