Простой полиморфизм

Как уже говорилось, возможность переопределения методов при наследовании является частным случаем полиморфизма.

Пример. Разработать класс для реализации объекта Трехмерная комната 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; просмотров: 1269;


Поиск по сайту:

При помощи поиска вы сможете найти нужную вам информацию.

Поделитесь с друзьями:

Если вам перенёс пользу информационный материал, или помог в учебе – поделитесь этим сайтом с друзьями и знакомыми.
helpiks.org - Хелпикс.Орг - 2014-2024 год. Материал сайта представляется для ознакомительного и учебного использования. | Поддержка
Генерация страницы за: 0.004 сек.