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

Вниз

Вопрос про метод Create   Найти похожие ветки 

 
Демонов Е.В. ©   (2002-10-22 17:28) [0]

Часто на форуме виже следущее

TComeType=class(ParentType)
newVariable:....
constructor create(someParams);override;
end;

constructor TComeType.create(someParams);override;
begin
newVariable:=Значение;
OldVariable:=Значение;

inherited;
end;

Где OldVariable свойство или переменная класса ParentType.

Так вот разве это правельно - разве не нужно сначало вызвать
inherite а уж потом чегото инициализировать?


 
alxx ©   (2002-10-22 17:47) [1]

Похоже, что это неправильно.


 
han_malign ©   (2002-10-22 17:55) [2]

Писать inherited Create - первым, а inherited Destroy - последним - считается правилом хорошего тона. Очень редко, когда полностью известна реализация предка, могут понадобится танцы с бубном(например чтобы изменить поведение унаследованного конструктора) - но обычно это говорит о неграмотном проектировании иерархии объектов.

type
TChild = class(TParent)
.........
end;
type TMyObjectClass = class of TMyObject;
const FMyObjectClass: TMyObjectClass = TMyObject;

constructor TParent.Create;
begin
FMyObject:=FMyObjectClass.Create;
end;

constructor TChild.Create;
begin
FMyObjectClass:=TMyObject1;
inherited;
end;


 
Юрий Зотов ©   (2002-10-22 18:20) [3]

Inherited можно писать в любом месте, где Вам требуется, и даже не писать совсем, если это не требуется.


 
Демонов Е.В. ©   (2002-10-23 10:39) [4]

>>Юрий Зотов
Почему ?


 
han_malign ©   (2002-10-23 10:43) [5]

Не почему, а зачем - при наследованиеи объектов, главная цель изменить(не всегда - расширить) функциональность, а каким образом - зависит от разработчика


 
Bis   (2002-10-23 10:45) [6]

но лучше все таки писать, тем более он "обнуляет" все переменные объекта, а это помогает в случае "забывчивости" избежать многих ошибок


 
han_malign ©   (2002-10-23 10:59) [7]

2 Bis
В Delphi поля объекта обнуляются в InitInstance, который вызывается перед входом в первый конструктор независимо от наличия inherited. (см. Classes.pas {compiller magic} _ClassCreate->NewInstance->InitInstance)


 
Демонов Е.В. ©   (2002-10-23 11:00) [8]

Нет.. Я просто думал что inherited в конструкторе собственно кроме действий перекытого метода Create вызавет там какието (не помню так сразу чтото на initInstance похожее-?) методы которые собственно и создадут экземпляр класса. Поэтому я не понимаю как до создания экземепляра класса словом inherited в методе Create можно инициалицировать какието ни было поля и свойства ?

Или собственно дело в том что create обознаxен как Constructor - и значит при его вызове сразу создаётся экземпляр, а inherited только вызывает унаследованный метод ?

Также и с Destructor destroy ?


 
han_malign ©   (2002-10-23 11:00) [9]

Извиняюсь не Classes.pas а System.pas


 
han_malign ©   (2002-10-23 11:04) [10]

procedure _ClassCreate;
asm
{ -> EAX = pointer to VMT }
{ <- EAX = pointer to instance }
PUSH EDX
PUSH ECX
PUSH EBX
TEST DL,DL
JL @@noAlloc
CALL dword ptr [EAX]. vmtNewInstance
@@noAlloc:
XOR EDX,EDX
LEA ECX,[ESP+16]
MOV EBX,FS:[EDX]
MOV [ECX].TExcFrame.next,EBX
MOV [ECX].TExcFrame.hEBP,EBP
MOV [ECX].TExcFrame.desc,offset @desc
MOV [ECX].TexcFrame.ConstructedObject,EAX { trick: remember copy to instance }
MOV FS:[EDX],ECX
POP EBX
POP ECX
POP EDX
RET

@desc:
JMP _HandleAnyException

{ destroy the object }

MOV EAX,[ESP+8+9*4]
MOV EAX,[EAX].TExcFrame.ConstructedObject
TEST EAX,EAX
JE @@skip
MOV ECX,[EAX]
MOV DL,$81
PUSH EAX
CALL dword ptr [ECX].vmtDestroy
POP EAX
CALL _ClassDestroy
@@skip:
{ reraise the exception }
CALL _RaiseAgain
end;


procedure _ClassDestroy;
asm
MOV EDX,[EAX]
CALL dword ptr [EDX]. vmtFreeInstance
end;


 
Юрий Зотов ©   (2002-10-23 11:15) [11]

Экземпляр класса теле самого конструктора НЕ создается. Он создается префиксным кодом, который генерит компилятор, если конструктор был вызван через ссылку на класс. Так что экземпляр класса создан как бы уже в "begin" и никакие inherited к этому отношения не имеют, хоть есть они, хоть их нет. Посмотрите, например, конструктор у TObject - он вообще пустой.

Аналогично - в деструкторе, сам деструктор ничего не уничтожает, это делает постфиксный код, который тоже генерит компилятор.



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

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

Наверх




Память: 0.5 MB
Время: 0.024 c
1-11249
cult
2002-10-25 15:30
2002.11.04
Сохранение published-свойств в поток


14-11397
kronprince
2002-10-04 10:44
2002.11.04
Надо на него напустить MJH :) - он популярно объяснит


14-11458
DeMoN-777
2002-10-16 01:56
2002.11.04
Autoexec.bat


4-11567
Infinity2
2002-09-21 02:29
2002.11.04
Как поставить хук на время в XP


14-11404
FLiz
2002-10-14 11:39
2002.11.04
При вставки из буфера вместо рус. букв знаки вопроса