![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Простой полиморфизм
Как уже говорилось, возможность переопределения методов при наследовании является частным случаем полиморфизма. Пример. Разработать класс для реализации объекта Трехмерная комната 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 часа)
|