Наследование - раздел Информатика, Определение объектов Наследование – Это Порождение Новых Типов Объектов (Пото...
Наследование – это порождение новых типов объектов (потомков) из уже имеющихся типов объектов (предков или прародителей). Объекты Потомки получают по наследству все поля и методы объекта Предка, могут быть дополнены новыми полями и методами, и, кроме того, могут переопределять методы объекта Предка, сохраняя или изменяя при этом у одноимённых методов списки формальных параметров и типы возвращаемых значений.
Поля объекта Предка в объекте Потомке заменять нельзя.Любой метод объекта Предка может быть вызван в любом методе объекта Потомка. В этом случае перед именем вызываемого метода указывается имя типа объекта Предка.При вызове метода прямого Предка в версии Турбо Паскаль 7.0 достаточно предварительно указать ключевое слово
INHERITED(унаследованный). Синтаксически наследование выражается следующим образом:Type
ИмяОбъектаНаследника=
OBJECT(
ИмяОбъектаПредка) Новые поля объекта наследника; Новые методы объекта наследника; END;Продолжим рассмотрение примера 1. При помощи типа объекта
TypeWin можно задавать значения координат для указания позиции выводимого элемента. Добавим новые действия: а) установить значение выводимого элемента и б) вывести элемент с заданной позиции на экран.Добавим также новые поля для обозначения выводимых элементов. Выводить будем символ или строку. Определим типы объектов наследников для выполнения этих действий.{Для символа}Type
TypeSym = OBJECT(
TypeWin)Ch:char;
Procedure INIT1(ax,ay:integer; ach:char);
Procedure SHOW1;END;
Procedure TypeSym.
INIT1;BeginInherited
INIT1(ax,ay);Ch:=achEnd;
Procedure TypeSym.
SHOW1;BeginGoToXY(x,y);Writeln(ch)End;{Для строки}Type
TypeStr = OBJECT(
TypeWin)S : String;
Procedure INIT1(ax,ay:integer; as:char);
Procedure SHOW1;END;
Procedure TypeStr.
INIT1;BeginInherited
INIT1(ax,ay);S:=asEnd;
Procedure TypeStr.
SHOW1;BeginGoToXY(x,y);Writeln(s)End;{описание экземпляров новых типов объектов}Var
och :
TypeSym;
Os :
TypeStr;{пример возможных операторов после добавления новых объектных типов и новых описаний}Begin
Och.
INIT(10,5,50,20,red);
Och.
INIT1(10,2,’!’);
Och.
SHOW;
Och.
Show1;Os.
INIT1(3,2,’&’);
Os.
Show1;ReadlnEnd.Из программы видно, что одноимённые методы
INIT1 и
SHOW1 содержатся в разных объектовых типах
TypeSym и
TypeStr. Связь объекта с нужным методом (размещение ссылок на методы) устанавливается в процессе компиляции, так что операторы
och.init1,
os.init1 (а также
och.show1 и
os.show1) выполняют вызов разных методов. Говорят, что происходит раннее связывание. Методы, с которыми осуществляется раннее связывание, называют статическими. Действие компилятора сводится к следующему:1) при вызове метода компилятор устанавливает тип объекта, вызывающего метод;2) в пределах найденного типа объекта компилятор ищет нужный метод, и, найдя его, назначает вызов метода;3) если метод в пределах типа объекта не найден, то компилятор устанавливает тип непосредственного прародителя и там ищет метод и т.д.;4) если вызванный метод нигде не найден, выдаётся сообщение об ошибке.Можно продолжить ряд наследования. Добавим поле, соответствующее цветовому атрибуту символа, и расширим методы
INIT1 и
SHOW1. Новый объектовый тип, производный от
TypeSym, может быть представлен в следующем виде:
Type
TypeSymCol=OBJECT(
TypeSym)Color : Integer;
Procedure INIT1(ax,ay,acolor:integer; ach:char);Procedure
SHOW1;End;
Procedure TypeSymCol.
INIT1;BeginInherited
Init1(ax,ay,ach);Color:=acolorEnd;
Procedure TypeSymCol.
SHOW1;BeginTextColor(color);Inherited
Show1End;{Описание экземпляра нового объектового типа:}Var
OchCol :
TypeSymCol;Можно показать в окне на дисплее символ, используя экземпляр объекта Och, и символ с его цветовым атрибутом, используя экземпляр объекта нового объектового типа:
Och.
Init(10,5,50,20,red);
Och.
Init1(2,3,’о’);
Och.
Show; Och.Show1;
OchCol.
Init1(3,3,yellow,’!’);
OchCol.
Show1;Экземпляры объектов
Och и
OchCol вызывают различные одноимённые методы
Init1 и
Show1, причём метод
Init1 в объектовых типах
Och и
OchCol имеет разное количество параметров.
Замечание: программист должен следить за тем, в каком окне следует отображать экземпляры объектов, нужно ли создавать новое окно и нужно ли удалять окно с экрана.
Пример 2.Рассмотрим пример использования объектов в графическом режиме. Опишем на нижнем уровне тип объекта для показа, стирания и передвижения по экрану точки с заданным цветовым атрибутом с и координатами изображения x,y. На следующем уровне добавим необходимые описания для выполнения тех же действий с окружностью. Наследуемые поля x,y будут соответствовать координатам центра окружности, добавленное поле r –радиусу окружности. Все методы в типе объекта наследника переопределим, сохранив за ними старые имена. На том же уровне наследования можно в дальнейшем расширить круг наследников, определив типы объектов для работы, например, с линией, прямоугольником и другими фигурами.Uses Crt, Graph;Var gd,gm:integer;Type
Tp=
ObjectX,y,c : integer;
Procedure Init(ax,ay,ac:integer);
Procedure Show;
Procedure Hide;
Procedure Moveto(dx,dy:integer);End;
Procedure Tp.
Init;BeginX:=ax; y:=ay; c:=acEnd;
Procedure Tp.
Show;BeginPutpixel(x,y,c);End;
Procedure Tp.
Hide;BeginPutpixel(x,y,Getbkcolor)End;
Procedure Tp.
Moveto;BeginDelay(1000); Hide;X:=x+dx; y:=y+dy;
ShowEnd; Type
Tc=Object(
Tp)R : integer;
Procedure Init(аx,ay,ac,ar : integer);
Procedure Show;
Procedure Hide;
Procedure Moveto(dx,dy : integer);End;
Procedure Tc.
Init;BeginInherited
Init(ax,ay,ac);R:=arEnd;
Procedure Tc.
Show;BeginSetcolor(c);Circle(x,y,r)End;
Procedure Tc.
Hide;BeginSetcolor(Getbkcolor);Circle(x,y,r)End;
Procedure Tc.
Moveto;BeginDelay(1000);
Hide;X:=x+dx; y:=y+dy;ShowEnd;Var
P : Tp;
C : Tc;Gd,gm: integer;Begin {main program}Gd:=Detect;Initgraph(Gd,Dm,’bgi’);
P.
Init(100,120,yellow);
P.
Show;
P.
Moveto(50,50);Readln;
C.
Init1(200,300,Green,150);
C.
Show;
C.
Moveto(10,10);Readln;ClosegraphEnd.Благодаря связи, устанавливаемой между объектами при наследовании, возможны присваивания между переменными экземпляров объектов разных объектовых типов. Совместимыми по присваиванию являются кроме эквивалентных типов, объектовые типы, состоящие в отношении наследования от типа-потомка к родительскому типу, но не наоборот.
O1:=Och; O1:=Os;{в прмере 1}
P:=C; {в примере2}При этом копируются (присваиваются) только те поля, которые являются общими для обоих типов.
Новости и инфо для студентов