Унаследованное ключевое слово вызывается автоматически в Delphi?

Согласно этой странице

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

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

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


person doctorlai    schedule 29.06.2013    source источник
comment
Возможно, чтобы устранить суть двусмысленности, цитируемое предложение говорит о том, что размещение inherited первым (в конструкторе) или последним (в деструкторе) не является обязательным - технически вы можете поместить свой собственный код до и после вызовов inherited, это просто что в большинстве случаев это не очень хорошая идея.   -  person J...    schedule 29.06.2013


Ответы (2)


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

person Andreas Rejbrand    schedule 29.06.2013

Нет, это не то, что это означает; это говорит о том, что вы можете не вызывать его, если у вас есть причина не вызывать его. Вы должны почти всегда вызывать 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;
person Ken White    schedule 29.06.2013
comment
Я думаю, что это яснее, чем принятый ответ. +1. Есть мыслимые (редкие) случаи, когда НЕ нужно вызывать его, и это намеренно, вероятно, заслуживает того, чтобы не вызывать унаследованный комментарий, потому что некоторые инструменты, такие как Pascal Analyzer от peganza, будут выдавать предупреждения, и даже возможно, что компилятор Delphi может выдать подсказку или предупреждение. . - person Warren P; 01.07.2013