Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика 2013.doc
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
649.73 Кб
Скачать

14. Объектный тип. Инкапсуляция. Полиморфизм. Наследование.

Объекты содержат в себе поля данных (как записи) и некоторые процедуры и (или) функции, предназначенные для обработки данных, хранящихся в полях объектов. Такие процедуры и функции принято называть методами объекта. Т.о. объекты, кроме информационной составляющей содержат в себе операционную составляющую и тем самым обладают внутренним потенциалом для «движения» в пространстве состояний объекта. Состояние объекта определяется текущими значениями его полей и следовательно, множество всевозможных наборов значений полей объектов образуют пространство состояний этого объекта. Соответственно, изменение значений полей, есть перемещение объекта в пространстве состояний.

Основными свойствами объектов является:

1) инкапсуляция – это объединение в объекте полей данных и методов.

2) полиморфизм – это возможность использования одного и того же имени метода для преобразования разнотипных объектов.

3) наследование – механизм наследования языка Паскаль позволяет программисту создавать иерархии объектных типов, при этом порождаемые объектные типы могут принимать (наследовать) необходимые им свойства от родительских типов (под свойствами здесь понимаются поля данных и методы). Кроме того, объектный тип-наследник может иметь свои уникальные поля данных и методы.

Описание объектного типа в Паскале имеет вид:

Object [(имя родительского типа)]

<описание данных>;

<описание методов>

end;

Имя родительского типа указывается в том случае, если определяется объектный тип-наследник. Описание полей данных имеет такую же структуру, как и при описании полей в комбинированных типах. Описание методов представляет собой заголовки соответствующих процедур и функций (как при опережающем описании). Полное описание подпрограмм, являющихся методами некоторого объектного типа, размещается вне «скобок» Object end.

Объектные типы могу определяться как в основной программе, так и в модулях. Если некоторый объектный тип определяется в модуле, как ресурс этого модуля, то описание объектного типа должно размещаться в интерфейсной части, а полное описание методов в реализованной части. В описании реализации методов в заголовках процедур и функций указывается только имя (как в опережающем описании).

Переменные объектных типов называются объектами или экземплярами объектов.

Над однотипными экземплярами объектов определена операция присваивания: vo1:=vo2;

В Паскале допустимо обращение к полям некоторого объекта «напрямую» с помощью уточненного имени.

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

Опишем объектный тип, экземпляры объекта которого способны хранить в своих полях текущую позицию курсора.

type tpos=object

line:byte; col:byte;

procedure Init(initline,initcol:byte);

function getline:byte;

function getcol:byte;

procedure print; end;

procedure tpos.init;

begin line:=initline; col:=initcol; end;

function tpos.getline;

begin getline:=line; end;

function tpos.getcol;

begin getcol:=col; end;

procedure tpos.print;

begin write(#7);end;

var vpos:tpos;

Опишем объектный тип, экземпляры объекта которого способны хранить в своих полях текущую позицию курсора и некоторый текущий символ. При этом метод Print должен выводить текущий символ в текущую позицию.

uses crt;

type tsym=object

line:byte; col:byte; sym:char;

procedure Init(initline,initcol:byte; initsym:char);

function getline:byte;

function getcol:byte;

procedure print; end;

procedure tsym.init;

begin line:=initline; col:=initcol; sym:=initsym; end;

function tsym.getline;

begin getline:=line; end;

function tsym.getcol;

begin getcol:=col; end;

procedure tsym.print;

begin gotoxy(col,line); write(sym); end;

var vsym:tsym;

Используя механизм наследования описания типа tsym, можно сделать следующим образом:

type tsym=Object(tpos)

sym:char;

procedure Init(initline,initcol:byte; initsym:char);

procedure print; end;

procedure tsym.init;

begin line:=initline; col:=initcol; sym:=initsym;end;

procedure tsym.print;

begin gotoxy(col,line); write(sym);end;

Полиморфизм.

В простейшем виде полиморфизм, связанный с объектными типами, проявляется в операторе присваивания, т.е. допустимым является оператор вида: vpos:=vsym;

Здесь экземпляру объекта родительского типа присваивается экземпляр объекта порожденного типа. Такое присваивание сводится фактически к заполнению соответствующими значениями экземпляра объекта, указанного в левой части оператора присваивания. Очевидно, что заполнение всех полей объекта левой части возможно, если типы левой и правой частей совпадают, либо справа объект порожденного типа (vsym:vpos).

Заметим, что сформулированные присваивания имеют транзитивный характер по иерархии объекта, т.е. если, например, тип tsym порождает некоторый тип tsym1 и vsym1:tsym1, то иерархия этих объектов: vpos -> vsym -> vsym1, то наряду с присваиванием vpos:=vsym допустимы присваивания: vsym:=vsym1; vpos:=vsym1;