Студопедия

КАТЕГОРИИ:


Архитектура-(3434)Астрономия-(809)Биология-(7483)Биотехнологии-(1457)Военное дело-(14632)Высокие технологии-(1363)География-(913)Геология-(1438)Государство-(451)Демография-(1065)Дом-(47672)Журналистика и СМИ-(912)Изобретательство-(14524)Иностранные языки-(4268)Информатика-(17799)Искусство-(1338)История-(13644)Компьютеры-(11121)Косметика-(55)Кулинария-(373)Культура-(8427)Лингвистика-(374)Литература-(1642)Маркетинг-(23702)Математика-(16968)Машиностроение-(1700)Медицина-(12668)Менеджмент-(24684)Механика-(15423)Науковедение-(506)Образование-(11852)Охрана труда-(3308)Педагогика-(5571)Полиграфия-(1312)Политика-(7869)Право-(5454)Приборостроение-(1369)Программирование-(2801)Производство-(97182)Промышленность-(8706)Психология-(18388)Религия-(3217)Связь-(10668)Сельское хозяйство-(299)Социология-(6455)Спорт-(42831)Строительство-(4793)Торговля-(5050)Транспорт-(2929)Туризм-(1568)Физика-(3942)Философия-(17015)Финансы-(26596)Химия-(22929)Экология-(12095)Экономика-(9961)Электроника-(8441)Электротехника-(4623)Энергетика-(12629)Юриспруденция-(1492)Ядерная техника-(1748)

Способы наследования и переопределения

Объект обладает важным свойством - наследование, которое позволяет при определении нового объекта- потомка использовать ранее определенный объект- предок или родительский тип. Тип TImage, задающий образец объекта, использоваться в программе самостоятельно не будет, однако он является предком целой иерархии объектов, например: строки, символа. Возьмем в качестве изображения символ и определим его тип, используя в качестве предка тип TImage. Мы хотим сохранить все поля предка, добавив лишь одно поле S, задающее конкретный символ. В этом случае в определении типа потомка необходимо сделать ссылку на имя родительского типа после слова Object:

type PSymbol = ^TSymbol; {указатель на объект – символ} TSymbol = object (TImage) S: char; end;

В этом случае в типе TSymbol неявно присутствуют все поля типа TImage. Аналогично переменной типа TSymbol или PSymbol доступны все методы из TImage, например:

var PS: PSymbol; begin New(PS); PS^.X:= 1; PS^.Y:= 2; PS^.S:='*'; writeln('координаты символа X,Y=', PS^.GetX: 5, PS^.GetY: 5); end;

Поля X, Y и методы GetX, GetY унаследованы от предка TImage, поле S определено в типе потомка TSymbol. Введение иерархии объектов позволяет более кратко описывать каждый объект-потомок, благодаря наследованию им всех свойств объекта родителя. Итак тип TSymbol наследует все поля и все методы родительского типа TImage. Однако очевидно, что не все методы предка подходят для манипуляций полями потомка. Например, процедура установки начальных значений Init должна определять кроме координат символа еще и сам символ. Кроме того, процедуры On, Off (включение/выключение изображения) и PrintImage (вывод изображения) целиком определяются типом объекта. Они будут разными для символа и строки, которые являются потомками объекта TImage.

Объектно-ориентированный подход позволяет определить новые методы для потомков со старыми именами методов родителя. Это свойство объектов называется переопределением. Рассмотрим новое определение объекта TSymbol:

type PSymbol = ^TSymbol; TSymbol = object(TImage) S:char; {обрабатываемый символ} procedure Init(A,B:integer; C:char); procedure On; procedure Off; procedure PrintImage; end;

Объект TSymbol содержит поля X, Y, RX, RY, V, унаследованные от родительского типа TImage, собственное поле S, свои методы TSymbol. Init, TSymbol.On, TSymbol.Off, TSymbol.PrintImage и три унаследованных и не переопределенных метода Move, GetX, GetY.

Приведем тексты переопределенных процедур:

procedure TSymbol.Init(A,B:integer;C:char); begin TImage.Init(A,B); S:=C; end; procedure TSymbol.On; begin V:=TRUE; GotoXY(X,Y); {процедура из модуля CRT, устанавливающая курсор в позиции X,Y} write(S); end; procedure TSymbol.Off; begin V:=FALSE; GotoXY(X,Y); write(' '); end; procedure TSymbol.PrintImage; begin writeln('символ:',S); end;

Вызов метода осуществляется с использованием имени экземпляра объекта, например:

var TS1: TSymbol; TI1 – {экземпляры объектов} TI1: TImage;... TS1.Init(1,2,'*'); TI1.Init(1,1);

Отметим, что переопределять можно только методы (но не переменные), причем новый метод может иметь другие формальные переметы (процедура Init). Новый метод "закрывает" одноименный метод в объекте-родителе.

Свойство наследования накладывает ограничения на имена полей: имена полей потомка не должны совпадать с именами полей в объекте-родителе.

Механизм наследования предоставляет широкие возможности по конструированию новых объектов, используя для их определения некоторые базовые типы, добавляя в них новые поля и переопределяя некоторые методы.

Для переменных объектного типа возможно присваивание значений экземпляра одного объекта экземпляру другого объекта в двух случаях: либо они имеют одинаковый объектный тип, либо они состоят в отношении наследования. В этом случае объекту-родителю присваивается значение объекта-потомка, например:

TI1:= TS1;

Присваивание осуществляется только для полей, являющихся общими для обоих типов.

<== предыдущая лекция | следующая лекция ==>
Объектный тип в Турбо-Паскале | Виртуальные методы
Поделиться с друзьями:


Дата добавления: 2014-01-06; Просмотров: 266; Нарушение авторских прав?; Мы поможем в написании вашей работы!


Нам важно ваше мнение! Был ли полезен опубликованный материал? Да | Нет



studopedia.su - Студопедия (2013 - 2024) год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! Последнее добавление




Генерация страницы за: 0.01 сек.