Простой полиморфизм
Как уже говорилось, возможность переопределения методов при наследовании является частным случаем полиморфизма.
Пример. Разработать класс для реализации объекта Трехмерная комната 2, который должен реагировать на запрос о суммарной площади стен и потолка.
Класс, реализующий данный объект будем наследовать от класса TRoom. Этот класс должен включать метод определения площади стен и потолка. Логично назвать этот метод Square, но метод с таким именем уже определен в базовом классе. Поскольку объект не должен реагировать на запрос о площади комнаты, метод Square базового класса можно переопределить.
Помимо переопределения метода Square класс TVRoom2 переопределяет метод инициализации полей объекта Init.
В Borland Pascal сохраняется возможность обращения к переопределенному родительскому методу из методов класса-потомка. С этой целью перед именем метода указывают служебное слово inherited или имя класса-родителя и точку. Окончательно получаем следующую программу:
Program ex;
Uses Room;
Type TVRoom2 = object(TRoom)
Height: real; {дополнительное поле класса}
function Square: real; {переопределенный истод класса}
procedure Init(l,w,h:real); {переопределенный инициализирующий метод}
end;
Procedure TVRoom2.Init;
Begin
{инициализируем поля базового класса}
inherited Init(l,w);{или TRoom.Init(l,w) }
height:=h; {инициализируем собственное поле класса}
End;
Function TVRoom2.Square;
Begin
Square: =inherited Square*height+2*height*'(length+width);
{обращаемсяк переопределенному методу базового класса}
End;
Var A:TVRoom2;
Begin
A.Init(3.4,5.1,2.8);
WriteLn('Площадь стен и потолка =', A.Square);
End.
Подключаемый метод в этом случае определяется типом Объекта, для которого метод вызывают. Тип объекта известен уже на этапе компиляции программы: он совпадает с типом переменной-объекта, следовательно, и метод, вызываемый в программе, можно определить на этапе компиляции (раннее связывание). Данный вариант переопределения методов получил название простого полиморфизма, а сами методы были названы статическим полиморфными.
Списки параметров статических полиморфных методов могут различаться. Так, в рассмотренном выше примере метод Init класса ТRoom имеет два параметра, а мегод Init класса TVRoom2 - три параметра.
Обращение объекта производного класса к переопределенному методу базового класса из программы. Объект производного класса может обратиться к переопределенному методу базового класса из программы, но для этого необходимо явно переопределить тип объекта, используя имя базового класса как функцию:
<имя базового класса>(<имя объекта производного класса>).<имя метода>.
Например:
Var A: TVRoom2;...
TRoom(A).Square:... {вызываем метод базового класса}
Такое переопределение типа в ООП называли восходящим приведением типа в отличие от нисходящего, которое используется, если требуемые методы или поля производного класса при обращении к объекту того же класса через указатель базового класса не видны. Восходящее приведение типа возможно всегда, в то время как при выполнении нисходящего приведения необходимо быть уверенным - что в данный момент времени указатель действительно содержит адрес обьекта производного класса или его потомков.
Лекция 32.Сложный полиморфизм (2 часа)
Дата добавления: 2015-12-01; просмотров: 1279;