|
||||
|
35. Расширяющиеся объекты Если определен порожденный тип, то методы порождающего типа наследуются, однако при желании они могут переопределяться. Для переопределения наследуемого метода попросту описывается новый метод с тем же именем, что и наследуемый метод, но с другим телом и (при необходимости) с другим множеством параметров. Определим дочерний по отношению к 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; Вызывая переопределяемый метод, необходимо быть уверенным в том, что порожденный тип объекта включает функциональность родителя. Кроме того, любое изменение в родительском методе автоматически оказывает влияние на все порожденные. Важное замечание: хотя методы могут быть переопределены, поля данных переопределяться не могут. После того как было определено поле данных в иерархии объекта, никакой дочерний тип не может определить поле данных в точности с таким же именем. |
|
||
Главная | Контакты | Нашёл ошибку | Прислать материал | Добавить в избранное |
||||
|