Студопедия

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

КАТЕГОРИИ:

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






Наследование






Наследованием называют конструирование новых более сложных производных классов из уже имеющихся базовых посредством добавления полей и методов.

При наследовании объекты класса-потомка получают возможность использования («наследуют») поля и методы класса-родителя, что позволяет повторно не определять этих компонентов класса.

При описании класса-потомка указывают класс-родитель и дополнительные, определенные только для класса-потомка, поля и методы:

Туре < имя класса-потомка> = 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; {явно переопределяем тип указателя}


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

mylektsii.su - Мои Лекции - 2015-2024 год. (0.007 сек.)Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав Пожаловаться на материал