![]() Главная страница Случайная страница КАТЕГОРИИ: АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатикаИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханикаОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторикаСоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансыХимияЧерчениеЭкологияЭкономикаЭлектроника |
Наследование
Наследованием называют конструирование новых более сложных производных классов из уже имеющихся базовых посредством добавления полей и методов. При наследовании объекты класса-потомка получают возможность использования («наследуют») поля и методы класса-родителя, что позволяет повторно не определять этих компонентов класса. При описании класса-потомка указывают класс-родитель и дополнительные, определенные только для класса-потомка, поля и методы: Туре < имя класса-потомка> = object(< имя класса – родителя>) < описание дополнительных полей и методов класса> end;... Пример. Разработать класс для реализации объекта Трехмерная комната, который должен реагировать на запрос о площади и объеме комнаты. В предыдущей задаче уже был определен класс TRoom в модуле Room, который содержал поля для хранения длины и ширины комнаты, метод инициализации полей и метод определения площади. Построим класс для реализации объекта Трехмерная комната на базе TRoom, добавив поле для хранения высоты комнаты и метод определения объема комнаты. Класс TRoom должен включать свой метод инициализации объектов. Разрабатываемая пpoграмма должна содержать ссылку на использование модуля Room, в котором описан родительский класс TRoom: Program ex; Uses Room; Type TVRoom = object(TRoom) height: real; {поле для хранения высоты} function V: real; {метод определения объема} procedure NewInit(l, w, h: real); {инициализирующий метод} end; Procedure TVRoom.NewInit; Begin Init(l, w); {инициализируем наследуемые поля класса} height: =h; {инициализируем собственное поле класса} End; Function TVRoom.V; Begin V: =Square*height; {обращаемся к методу базовот класса} End; Var A: TVRoom; Begin A.NewInit(3.4, 5.1, 2.8); WriteLn('Площадь комнаты = ', A.Siquare: 6: 2); WriteLn('Объем комнаты = ', A.V: 6: 2); End. Класс TVRoom, таким образом, включает три поля: length, width и height и четыре метода: Square, Init, NewInit и V. Все поля и методы доступны из методов производного класса и программы. Если программа, работая с объектами класса-потомка, не использует некоторых методов родителя, то в исполняемую программу они не включаются. Примечание. По правилам Borland Pascal у класса может быть только один родитель, но сколько угодно потомков. Поскольку кажлый произволный класс добавляет при наследовании свои поля и методы, в иерархии классов по мерс удаления от корня дерева иерархии сложность классов и соответственно объектов, которые эти классы реализуют, возрастает. Одновременно возрастает и специализация классов. Наиболее универсальные классы, таким образом, находятся у корня дерева классов. Операция присваивания объектов родственных классов. В Borland Pascal допустимо присваивание объектам класса-родителя значений объектов класса-потомка. Обратное присваивание не разрешено, так как при его выполнении методом «поле за полем» собственные поля объекта класса-пoтомка окажутся не определенными. Например: Var A: TRoom; B: TVRoom;... А: =В; {допустимо} В: =А;... {недопустимо: ошибка! } Особенности работы с указателями на объекты родственных классов. По правилам Borland Pascal допустимо указателям на объекты класса-родителя присваивать адреса абъектов класса-потомка. Однако при этом указатель на объект базового класса не обеспечивает возможности обращения к полям и методам, объявленным в производном классе. Например: Var pC: ^TRoom; {указатель на объекты базового класса} E: TVRoom;... {объект производного класса} рС: =@Е; {присваиваем указателю на объекты базового класса адрес объекта производного класса} pC^.height: =2.7; {ошибки, указатель на объекты типа класса-родителя не подозревает о существовании поля height класса TVRoom} В этих случаях приходится явно переопределять тип указателя, используя имя типа указателя: Type pTVRoom=^TVRoom; Var pC: ^TRоот; {указатель на объекты базового класса) E: TVRoom;... {объект производного класса} рС: = @E; {присваиваем указателю на объекты базового класса адрес объекта производного класса} pTVRoom(pC)^.hei gh t: =2.7; {явно переопределяем тип указателя}
|