Свойство наследования.
Свойства наследования и полиморфизма
Математическая модель.
Постановка задачи.
Пример объектного типа.
Структура объявления объектного типа.
TYPE
<имя_типа>=OBJECT
<имя_поля>:<тип_поля>;
…
<методы>;
END;
После объявления типа объекта должны следовать определения всех методов, перечисленных в объектном типе, которые представляют собой тексты процедур и функций. Отличие от обычного определения заключается в том, что имя подпрограммы, являющейся методом объекта, указываемое в её заголовке, состоит из 2 частей:
<имя_типа>.<имя_подпрограммы>
Реализовать движение точки на экране.
Каждая точка на экране характеризуется координатами x, y и состоянием v –видима/невидима.
3. Объявление объектного типа POINT:
type
POINT=object
X, Y: integer; {координаты}
V: boolean; {признак видимости: TRUE-видима; FALSE-невидима}
function GET_X: integer; { получение координаты Х }
function GET_Y: integer; { получение координаты Y }
function GET_V: boolean; { получение признака видимости }
procedure INIT(X0, Y0: integer); { задание координат }
procedure TURN_ON; { рисование точки – получение видимой точки }
procedure TURN_OFF; { стирание точки – получение невидимой точки}
procedure MOVE(XN, YN: integer); { перемещение точки }
end;
4. Определение методов объекта POINT:
function POINT.GET_X; { получение координаты Х }
begin
GET_X:=X;
end;
function POINT.GET_Y; { получение координаты Y }
begin
GET_Y:=Y;
end;
function POINT.GET_V; { получение признака видимости }
begin
GET_V:=V;
end;
procedure POINT.INIT; { задание координат }
begin
X:=X0;
Y:=Y0;
V:=false;
end;
procedure POINT.TURN_ON; { получение видимой точки }
begin
if not V then
begin
PutPixel(X,Y,GetColor); { GetColor возвращает текущий цвет }
V:=true;
end;
end;
procedure POINT.TURN_OFF; { получение невидимой точки – стирание точки }
begin
if V then
begin
PutPixel(X,Y,GetBkColor); { GetBkColor возвращает фоновый цвет }
V:=false;
end;
end;
procedure POINT.MOVE; { перемещение точки }
var
F: boolean;
begin
F:=V;
if F then
TURN_OFF;
X:=XN;
Y:=YN;
if F then
TURN_ON;
end;
5. Использование объекта POINT: в программе должна быть объявлена переменная типа POINT:
var
P: POINT;
Для обращения к методам объекта в программе будут использоваться составные имена: P.INIT(10,20), P.TURN_ON.
При создании типа POINT в ОП создается следующая структура объекта P:
INTEGER (X) – 2 б |
INTEGER (Y) – 2 б |
BOOLEAN (V) – 1 б |
@GET_X (адрес – 4 б) |
@CET_Y (адрес – 4 б) |
@GET_V (адрес – 4 б) |
@INIT (адрес – 4 б) |
@TURN_ON (4 б) |
@TURN_OFF (4 б) |
@MOVE (4 б) |
Структура объекта занимает 33 байта.
Кроме точки, можно задать другие объекты, описывающие геометрические фигуры, например, объект типа окружность, который определяется радиусом, координатой центра, признаком видимости, и с ним возможны такие же действия, как с точкой: получение видимой окружности; получение невидимой окружности; перемещение окружности (изменение координат центра). Чтобы этот объект привязать к координатной сетке экрана, необходимо определить объектный тип PLACE (место), который будет иметь данные, общие для всех геометрических фигур, – координаты привязки объекта к экрану X и Y:
type
PLACE=object
X, Y: integer;
procedure INIT(X0, Y0: integer);
function GET_X: integer;
function GET_Y: integer;
end;
{ далее следует описание методов }
Каждый новый объектный тип может строиться на основе ранее определенного типа, называемого родительским типом, от которого наследуются все поля и методы. Чтобы произошло наследование, в объявлении объектного типа после OBJECT в скобках указывается имя родительского типа.
Правила наследования заключаются в следующем:
· в объявлении типа наследника не должно быть полей, совпадающих по именам с полями родителя; имена методов могут совпадать, в чем проявляется свойство полиморфизма;
· при построении объектного типа наследника, в первую очередь, наследуются поля родителя, затем добавляются поля наследника; после полей наследуются все методы родителя, затем добавляются методы наследника, если их имена не совпадают с именами методов родителя; если совпадения существуют, то это означает, что методы наследника являются полиморфными методами и замещают одноименные методы родителя.
Используя тип PLACE как родительский, можно определить объектный тип POINT таким образом:
type
POINT=object(PLACE)
V: boolean;
procedure INIT(X0, Y0: integer);
function GET_V:boolean;
procedure TURN_ON;
procedure TURN_OFF;
procedure MOVE(XN, YN: integer);
end;
{ далее следует описание методов }
Теперь структура объекта P в ОП будет следующая: