Главная страница
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.021 c
1-11253
Delphi Maniak
2002-10-23 09:56
2002.11.04
Чтение линий из TMemo


1-11208
Юрий
2002-10-24 21:14
2002.11.04
TClientSocket и TServerSocket в одной процедуре


4-11543
raiks
2002-09-22 11:55
2002.11.04
Подавить звук, производимый системой при нажатии на Enter в TEdit


1-11200
Алексей Смирнов
2002-10-24 20:39
2002.11.04
Программа решения кроссвордов


7-11529
Kostyan
2002-08-28 14:33
2002.11.04
Как узнать сколько COM-портов не используя реестр?