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

Вниз

нужно или не нужно вставлять inherited create?   Найти похожие ветки 

 
Pasha L   (2008-07-04 17:30) [0]

Здравствуйте. Я создал класс TMyList от существующего класса TList. На Create мне нужно повесить некоторые действия. Делать так?:

constructor TMyList.Create;
begin
 inherited create;
 //bla bla bla
end;


или inherited create не нужен?


 
Ega23 ©   (2008-07-04 17:35) [1]


> Я создал класс TMyList от существующего класса TList.


конкретно в этом случае - не нужен.


 
Pasha L   (2008-07-04 17:41) [2]

почему, можете объяснить?


 
Pasha L   (2008-07-04 17:42) [3]

то есть, если у класса-родителя конструктор стандартный от TObject, то можно не писать inherited create, а если нет - то нужно писать?


 
sniknik ©   (2008-07-04 17:58) [4]

> почему, можете объяснить?
пишешь гденибудь в коде TList.Create, зажимаешь Ctrl и кликаеш мышкой по Create -> попадаешь туда где она описана, видиш
constructor TObject.Create;
begin
end;

никакого кода нет..., так зачем же его вызывать?
это с практической стороны, с теоретической же лучше писать всегда, т.к. базовый класс может быть изменен (особенно если базовый тоже свой, и там где кода нет он может появиться), и тогда не придется мучительно вспоминать где же я там его не написал, а теперь нужно исправить. вреда же пустой вызов не принесет (имхо, оптимизатор при ненужности его сам выкинет. проверить можно посмотрев код в CPU в обоих случаях).


 
Pasha L   (2008-07-04 18:01) [5]

значит при inherited create лишнего объекта не создается?


 
Dennis I. Komarov ©   (2008-07-04 18:02) [6]

> [5] Pasha L   (04.07.08 18:01)

нет


 
Правильный-Вася   (2008-07-04 18:08) [7]


> значит при inherited create лишнего объекта не создается?

объект один и тот же, а это вызов конструктора предка, чтоб правильно  его инициализировать


 
Anatoly Podgoretsky ©   (2008-07-04 20:10) [8]

Я не стал бы закладыватся на текущую реализацию генофонда, и в обязательном порядке бы вызвал, нафига самому себе веревку намыливать.
Правда вызов бы сделал в такой форме

inherited;


 
Юрий Зотов ©   (2008-07-06 00:27) [9]

> Pasha L   (04.07.08 18:01) [5]

> значит при inherited create лишнего объекта не создается?

Нет. Код конструктора вообще не создает объекта, он только его его инициализирует. Объект создается при вызове конструктора через ссылку на класс и в код конструктора попадает уже готовым.


 
Германн ©   (2008-07-06 01:12) [10]


> Юрий Зотов ©   (06.07.08 00:27) [9]


> Объект создается при вызове конструктора
> через ссылку на класс

Хм. На пальцах понял. А на практике? Разве в конструкторах запрещено вызывать конструктор не непосредственного предка путем явного указания?


 
DrPass ©   (2008-07-06 23:58) [11]


> Хм. На пальцах понял. А на практике? Разве в конструкторах
> запрещено вызывать конструктор не непосредственного предка
> путем явного указания?

Не запрещено, но никакого другого объекта это не создаст. Конструктор сам по себе - всего лишь рядовой метод класса. "Особенным" его делает compiler-magic код, который неявно добавляется при вызове variable:= TSomeObject.SomeConstructor(...). Добавляется, естественно, только один раз. Поэтому сколько родительских конструкторов в нем не вызывай, объект будет только один.


 
Германн ©   (2008-07-07 01:04) [12]


> DrPass ©   (06.07.08 23:58) [11]
>
>

Это-то понятно. Не первый раз замужем. :)


 
Григорьев Антон ©   (2008-07-07 12:09) [13]


> DrPass ©   (06.07.08 23:58) [11]
> Конструктор сам по себе - всего лишь рядовой метод класса.
>  "Особенным" его делает compiler-magic код, который неявно
> добавляется при вызове variable:= TSomeObject.SomeConstructor(.
> ..).

Не совсем так. У конструктора очень хитрый пролог. Если он вызывается как классовый метод (т.е. TClassName.Create), то в прологе выполняется код создания объекта, если как обычный метод (ObjName.Create), то ничего такого не выполняется, конструктор работает как обычный метод. Поэтому, когда вызывается унаследованный конструктор, никакого повторного создания объекта не происходит - там неявно подставляется Self, т.е. не тип, а объект, поэтому пролог конструктора никакого создания объекта не выполняет.


 
DrPass ©   (2008-07-07 12:21) [14]


> Григорьев Антон ©   (07.07.08 12:09) [13]

Да я в общем-то это и написал...


 
Игорь Шевченко ©   (2008-07-07 12:41) [15]

Григорьев Антон ©   (07.07.08 12:09) [13]

У конструктора есть неявный параметр, а именно второй, который и определяет, вызывать функцию _ClassCreate или не вызывать :)



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

Форум: "Начинающим";
Текущий архив: 2008.08.10;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.007 c
2-1215418081
IGray
2008-07-07 12:08
2008.08.10
Экспорт ветки реестра в REG-файл без Regedit-a.


8-1183726658
Sonic90
2007-07-06 16:57
2008.08.10
Версия MP3 тегов


15-1214150174
KilkennyCat
2008-06-22 19:56
2008.08.10
XML-парсеры для Delphi.


2-1215448273
blazerad
2008-07-07 20:31
2008.08.10
Создание БД для Клиент сервера


11-1192280293
Elec3C
2007-10-13 16:58
2008.08.10
F12





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский