
- •Объектно–ориентированное программирование
- •I. Основные принципы ооп
- •II. Структура объявления объектного типа
- •III. Свойство наследования
- •1. Правила наследования.
- •2. Свойство полиморфизма.
- •IV. Виртуальные методы
- •1. Раннее и позднее связывание методов.
- •2. Виртуальные методы и таблица виртуальных методов (твм).
- •3. Конструктор.
- •4. Деструктор.
- •V. Пример объектного типа
- •3. Объявление объектного типа точка:
- •4. Определение методов объекта point:
- •5. Свойство наследования.
- •7. Раннее и позднее связывание методов.
3. Объявление объектного типа точка:
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. Свойство наследования.
Кроме точки, можно задать другие объекты, описывающие геометрические фигуры, например, объект типа окружность, который определяется радиусом, координатой центра, признаком видимости, и с ним возможны такие же действия, как с точкой: получение видимой окружности; получение невидимой окружности; перемещение окружности (изменение координат центра). Чтобы этот объект привязать к координатной сетке экрана, необходимо определить объектный тип 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;
{ далее следует описание методов }
6. Свойство полиморфизма заключается в том, что в объявлении типа наследника могут быть методы, одноименные с именами методов родителя.
Объявление типа окружность c использованием в качестве родителя типа POINT будет следующим:
type
CIRCL=object(POINT)
R: integer;
procedure INIT(X0, Y0, R0: integer); { задание окружности }
procedure TURN_ON; { получение видимой окружности }
procedure TURN_OFF; { получение невидимой окружности }
procedure MOVE(XN, YN: integer); { перемещение окружности}
function GET_R: integer; { получение радиуса }
end;
Определение методов с использованием наследования при полиморфизме:
procedure CIRCL.INIT;
begin
X:=X0; Y:=Y0;
R:=R0;
V:=false;
end;
procedure CIRCL.TURN_ON;
begin
V:=true;
CIRCLE(X,Y,R);
end;
procedure CIRCL.TURN_OFF;
var
C: byte;
begin
C:=GetColor;
SetColor(GetBkColor); { установка цвета рисования }
Circle(X,Y,R);
V:=false;
SetColor(C);
end;
procedure CIRCL.MOVE;
var
F: boolean;
begin
F:=V;
if F then
TURN_OFF;
X:=XN;
Y:=YN;
if F then
TURN_ON;
end;
function CIRCL.GET_R;
begin
GET_R:=R;
end;
В результате текст процедуры CIRCL.MOVE совпадает с текстом процедуры POINT.MOVE, но машинные коды у этих процедур будут разные; CIRCL.MOVE при своем исполнении обращается к адресам процедур CIRCL.TURN_ON и CIRCL.TURN_OFF, а процедура POINT.MOVE – к адресам процедур POINT.TURN_ON и POINT.TURN_OFF.