Задан. род. типа означ., что в объектн. типе Tstaff неявно присуств. все поля и методы типа Tperson.описан. св- во объектн. типов. наз-ся наследов. и широко использ. в ООП.Один тип мож. явл. предком дляя произв. числа типов-потомк., в то время как любой объект. тип мож. наслед. поля и мет. только одн. непосредств. типа – род., кот. указ. в кругл. скобк.
Точно также опред. тип Tteacher,указ. в кч типа предк Tstaff
type Tteacher = object(Tstaff)
Hours:word;
End;
В этом случ. Tteacher унаслед. все поля Tstaff, в том числе и унаслед. им от Tperson. Тип потомок наслед. все поля род. типа,в их числе поля, унаслед в свою очер. родит. типом от своих предков. Наслед. поля использ. так, как если бы они были описаны в дан. типе – потомке.Поля наслед. без какого либо исключ.Поэтому обьявляя нов. поля, необх. след. за уник. их имен.Совпад. имени нов. поля с имен. наслед. поля вызовет ошибку.
Неск. сложн. обстот.дело с метод.Они также наслед.Понятно, однако, что метод Init в таком виде, как он описан для Tperson, не год-ся ни для Tstaff, ни для Tteacher.ООП предост. возможн. переопредел. методов.Для переопредел. наслед. метода просто описыв.нов метод с тем же именем, но с др. телом и даже, при необход., с др. кол-м пар- ов.
Однако в наш. случ. нет необход. полностью переопред. метод Tperson.Init – можно просто воспользов. вызовом переопредел. метода внутри нов. методов Tstaff.Init и Tteacher.Init. тогда ипы Tstaff и Tteacher должны быть описаны так:
type Tstaff=object(Tperson)
Bonus:real;
Procedure Init(nm:string;m,b:real);
End;
Type Tteacher = object(Tstaff)
Hours:word;
Procedure Init(nm:string;m,b:real;h:word);
End;
Procedure Tstaff.Init;]
Begin
Tperson.Init(nm,m);
Bonus:=b;
End;
Procedure Tteacher.Init;
Begin
Tstaff.Init(nm,m,b);
Hours:=h;
end;
Необх. замет. что переопред. только мет. но не поля.Поля наслед в том виде, в кот. они были описан в объекте – предке.
Кроме того, при переопр. метода, особенно с использ. вызова переопр. метод., необх. быть уверен., в том что метод будет работ. правильно., и помнить что кажд.измен. в род. методе влияет на все аналогичные методы в объект-потомках.
Возвращ. к реш. поставл. задачи, нетрудно видеть, что нам необх. по крайн. мере еще один метод для кажд. из типов Tstaff и Tteacher – метод, вычисл. ежемесячн. выплаты.Оформим его в виде функции.
function Tstaff.Getsum:real;
Begin
Getsum:=money+bonus; {учтена премия}
End;
Function Tteacher.Getsum:real; {утено кол-во}
Begin {аудиторн. часов}
Getsum:=Tstaff.Getsum+ 0.01* hours* money;
End;
Поскольку зарпл. начисл. по – разн. разн. категор. сотрудн. инстит., метод Getsum долж. быть переопредел. для объекта Tteacher,явл-ся дочерн. по отнош. к Tstaff.Нет смысла переопред. метод Tteacher. Getsum полностьюЮ проще испол. при переопред. аналог. метод предка, что и было сделан.Таким образ., на примере мтод. Getsum еще раз была продемонстрир. возможн. наследов. и переопредел. методов. Рассм. тип насл. когда кажд. об. имеет только одн. непоср. род., нз. один. наслед.ООПподдерж. имен. этот тип наслед. один тип наслед. от 2 и бол род. типов – множеств. наслед.(С++)
30.ООП. Полиморфизм. Раннее и позднее связывание. Статические и виртуальные
методы.
Рассм метод Showsum из мод Persons. Перв. раз. он был опрдел. в объекте Tstaff Для объекта Tteacher тело метода полностью совпад. с теом метод. Tstaff.Showsum.Учитыв.,что Tteacher zdk-cz gjnjvrjv Tstaff и что объект. присуще наследование как полей так и метод. каз. бы можно было записыв. Showsum еще раз в объекте Tteacher Однако если этого не сдел. Showsum, вызван. экземпляр. объекта Tteacher. Однако, еси этого не сдел., Showsum, вызван. экземпл. объекта Teacher, будет раб неправ, выч. зарпл. так же ак для Tstaff – без учета аудиторн.нагрузки. Это объясн. спо., кот компил осущ. вызов метод.Снач он ищ. мет. с зад. имен. внутри объектн. типа, экземпл. кот. вызыв. метод.
Уважаемый посетитель!
Чтобы распечатать файл, скачайте его (в формате Word).
Ссылка на скачивание - внизу страницы.