![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Конструкторы
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 а другим, что
> нить плохое произойдет?
ничего плохого не произойдет
обзови его хоть валенком, лишь бы компилятор знал, что речь идет именно о конструирующем методе класса
> будет ли это вообще работать? если да, то как?
будет работать точно так же как любой иной конструктор с любым иным именем метода