Студопедия

Главная страница Случайная страница

Разделы сайта

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника






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






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

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

 






© 2023 :: MyLektsii.ru :: Мои Лекции
Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав.
Копирование текстов разрешено только с указанием индексируемой ссылки на источник.