2013-06-29 2 views
3

Согласно этой страницеЯвляется ли унаследованное ключевое слово, называемое автоматически в Delphi?

http://www.delphibasics.co.uk/RTL.asp?Name=Inherited

Он говорит: «Это называется в начале конструктора, а в конце desctructor. Это не является обязательным, но рекомендуется как хорошая практика.»

Не понял ли я это правильно? Означает ли это, что нам не нужно помещать «унаследованные» в конструктор или деструктор, потому что он будет автоматически вставлен компилятором?

+1

Чтобы, возможно, рассмотреть суть неоднозначности, цитируемое предложение говорят, что размещение 'inherited' первый (в конструкторе) или последний (в деструкторе) не является обязательным - технически вы можете поместить свой собственный код до и после вызовов на «унаследованный», это просто, что большую часть времени это не очень хорошая идея. –

ответ

10

Нет, inherited не вызывается автоматически; вы должны сделать это самостоятельно (если вы хотите вызвать унаследованную процедуру, которую вы обычно делаете). И вы можете даже выбрать , когда сделать это, см., Например, this answer. Обычно вы делаете это в начале конструктора и в конце деструктора.

+0

+1. Приятно и быстро, и очень хорошо его покрывает. :-) –

8

Нет, это не то, что это значит; что он говорит, что вы можете не называть его, если у вас есть причина не называть его. Вы должны почти всегда вызывать inherited в каждом методе, который вы переопределяете, если вам не нужно, чтобы что-то не произошло в вашем потомке, что делает родитель.

Если у вас нет оснований для этого, вы всегда должны называть inherited первой строкой своего конструктора и последней строкой вашего деструктора. Это никогда не называется автоматически.

Delphi делает это очень легко; если ваш переопределяется метод имеет те же параметры, что и родители, вы не должны даже передать их:

constructor TMyClass.Create(AOwner: TComponent); 
begin 
    inherited;   // Automatically passes AOwner to parent constructor 
    // Do other construction here 
end; 

destructor TMyClass.Destroy; 
begin 
    // Do your own cleanup 
    inherited; 
end; 
+0

Я думаю, что это яснее, чем принятый ответ. +1. Существуют мыслимые (редкие) случаи, когда НЕ следует называть его, и поэтому намеренно, вероятно, заслуживает «не называть унаследованный» комментарий, потому что некоторые инструменты, такие как Pascal Analyzer из peganza, выдают предупреждения, и даже возможно, что компилятор Delphi может дать подсказку или предупреждение. –

Смежные вопросы