суббота, 11 мая 2013 г.

Вызов методов предка с ключевым словом inherited

Delphi позволяет нам использовать ДВЕ формы вызова родительского метода при помощи ключевого слова inherited.

С использованием имени метода:

procedure TSomeObject.Cleanup; // override
begin
 SomeOwnCode;
 inherited Cleanup;
end;


И без использования имени метода:

procedure TSomeObject.Cleanup; // override
begin
 SomeOwnCode;
 inherited;
end;


-- я лично при прочих равных - предпочитаю ВТОРУЮ форму.

Почему? Потому, что при активном рефакторинге и переименовании методов - она - УСТОЙЧИВЕЕ. Не надо бегать и синхронизировать имена методов.

Есть правда одна ЗАСАДА.

Если ВДРУГ написано так:

type
 TA = class
  protected
   procedure Cleanup; virtual;
 end;
 
 TB = class(TA)
  private
   procedure Cleanup; override;
 end;
 
 TC = class(TB)
  protected
   procedure Cleanup; override;
 end;


-- то при записи:

procedure TC.Cleanup; //override;
begin
 SomeOwnCode;
 inherited;
end;


Вызовется не тот метод, который мы ожидаем - TB.Cleanup, а метод TA.Cleanup. Хм.. (задумался)... Или НИЧЕГО не вызовет. Не помню. Склероз. Завтра - проверю.

Правда компилятор выдаст Warning о понижении видимости виртуального метода.

А при вызове:

procedure TC.Cleanup; //override;
begin
 SomeOwnCode;
 inherited Cleanup;
end;


-- нас обругает компилятор. Скажет - "не знаю такого метода в базовом классе".

Комментариев нет:

Отправить комментарий