Форум: "Начинающим";
Текущий архив: 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.48 MB
Время: 0.007 c