Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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


dapher ©   (2005-12-15 14:16:00) 

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


Anatoly Podgoretsky   (2005-12-15 15:51:00) [1]

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


PVOzerski   (2005-12-15 15:32:00) [2]

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


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

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


Джо   (2005-12-15 15:27:00) [4]

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


PVOzerski   (2005-12-15 15:25:00) [5]

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

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


PVOzerski   (2005-12-15 15:21:00) [6]

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


dapher   (2005-12-15 15:20:00) [7]

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

TMyClass = class
 FSomeField1: TSomeType1;
 FSomeField2: TSomeType2;

 procedure SomeMethod;
end;

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

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


Deka   (2005-12-15 15:15:00) [8]

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


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

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


Digitman   (2005-12-15 14:52:00) [10]


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


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

например,

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

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


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

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


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


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

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


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

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


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

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

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

var
 Bar: TBar;

Bar := Bar.Foo;


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


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

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


alex_***   (2005-12-15 14:25:00) [16]

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


Digitman   (2005-12-15 14:20:00) [17]


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


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

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


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


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


Наверх

Титульная страница Поиск, карта сайта Написать письмо