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

Наследование – это порождение новых типов объектов (потомков) из уже имеющихся типов объектов (предков или прародителей). Объекты Потомки получают по наследству все поля и методы объекта Предка, могут быть дополнены новыми полями и методами, и, кроме того, могут переопределять методы объекта Предка, сохраняя или изменяя при этом у одноимённых методов списки формальных параметров и типы возвращаемых значений. Поля объекта Предка в объекте Потомке заменять нельзя.Любой метод объекта Предка может быть вызван в любом методе объекта Потомка. В этом случае перед именем вызываемого метода указывается имя типа объекта Предка.При вызове метода прямого Предка в версии Турбо Паскаль 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;{пример возможных операторов после добавления новых объектных типов и новых описаний}BeginOch.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;VarP : 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}При этом копируются (присваиваются) только те поля, которые являются общими для обоих типов.