Если определен порожденный тип, то методы порождающего типа наследуются, однако при желании они могут переопределяться. Для переопределения наследуемого метода попросту описывается новый метод с тем же именем, что и наследуемый метод, но с другим телом и (при необходимости) с другим множеством параметров.
Определим дочерний по отношению к TEmployee тип, представляющий работника, которому платится часовая ставка, в следующем примере:
const.
PayPeriods = 26; { периоды выплат }.
OvertimeThreshold = 80; { на период выплаты }.
OvertimeFactor = 1.5; { почасовой коэффициент }.
type.
THourly = object (TEmployee).
Time: Integer;
procedure Init (AName, ATitle: string; ARate:
Real, Atime: Integer);
function GetPayAmount: Real;
end;
procedure THourly. Init (AName, ATitle: string;
ARate: Real, Atime: Integer);
begin.
TEmployee.Init (AName, ATitle, ARate);
Time:= ATime;
end;
function THourly. GetPayAmount: Real;
var.
Overtime: Integer;
begin.
Overtime:= Time — OvertimeThreshold;
if Overtime > 0 then.
GetPayAmount:= RoundPay (OvertimeThreshold * Rate.
Rate OverTime * OvertimeFactor.
* Rate).
else.
GetPayAmount:= RoundPay (Time * Rate).
end;
Вызывая переопределяемый метод, необходимо быть уверенным в том, что порожденный тип объекта включает функциональность родителя. Кроме того, любое изменение в родительском методе автоматически оказывает влияние на все порожденные.
Важное замечание: хотя методы могут быть переопределены, поля данных переопределяться не могут. После того как было определено поле данных в иерархии объекта, никакой дочерний тип не может определить поле данных в точности с таким же именем.