Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2002.11.04;
Скачать: [xml.tar.bz2];

Вниз

Вопрос про метод 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.008 c
1-11336
b-Ars
2002-10-23 12:32
2002.11.04
Создание формы в Run-Time из dfm-файла


1-11270
Alex4444444444
2002-10-23 11:59
2002.11.04
Рессурсы


7-11523
compsr
2002-09-03 09:58
2002.11.04
Принтер по умолчанию


1-11202
AL2002
2002-10-18 17:21
2002.11.04
Project/Options/Forms


1-11227
Semion
2002-10-25 08:33
2002.11.04
Чтение и запись в файл





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский