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

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

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

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

ОСНОВНЫЕ КОНЦЕПЦИИ ОБЪЕКТНОЙ ТЕХНОЛОГИИ:

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

Множественное наследование подразумевает, что подкласс может иметь более одного «родителя». Например, собака является млекопитающим и, кроме того, домашним животным, следовательно, объект класса «собака» наследует свойства обоих классов: «млекопитающие» и «домашние животные».

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

Полиморфизм означает, что методы, принадлежащие к различным классам, могут использовать один и тот же интерфейс вне зависимости от конкретной реализации этих методов. По-другому - это возможность использования одного и того же имени метода для преобразования разнотипных объектов. Например, предположим, что приложение работает с несколькими разными классами объектов – Письмо, Почтовая метка и Идентификационная Карточка, – каждый из которых связан с одним и тем же методом «ПечатьАдреса». В подобном случае в приложении не требуется специальных команд форматирования адреса для каждого отдельного объекта, оно просто вызывает метод «ПечатьАдреса» нужного объекта. Принцип полиморфизма означает, что каждый объект исполняет команду так, как это определено для данного класса объектов.

Пример создания нового объекта и работы с ним в языке программирования Java:

// Создание экземпляра класса ArrayList с именем list

ArrayList list = new ArrayList();

// Добавление экземпляров класса Integer в объект list

list.add(new Integer(1));

list.add(new Integer(2));

list.add(new Integer(3));

Подразумевается, что класс ArrayList уже описан в программном коде и его описание содержит определение для конструктора класса и метода add.

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

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;