Глава 13. Объектно-ориентированное программирование




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

Объектно-ориентированное программирование базируется на трех основных понятиях: инкапсуляции, наследовании, полиморфизме.

Инкапсуляция — это комбинирование данных с процедурами и функциями, которые манипулируют этими данными. В результате получается новый тип данных — объект.

Наследование — это возможность использования уже определенных объектов для построения иерархии объектов, производных от них. Каждый из «наследников» наследует описания данных «прародителя» и доступ к методам их обработки.

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

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

Определения объектов

Объект — это такая структура, компонентами которой являются взаимосвязанные данные различных типов и использующие эти данные процедуры и функции. Компоненты-данные называются полями объекта, а компоненты-процедуры и функции называются {270} методами. Для обозначения типа «объект» в языке имеется служебное слово OBJECT. Тип объекта описывается способом, похожим на задание типа «запись»:

TYPE

ИмяОбъекта = OBJECT

ПоляДанных;

ЗаголовкиМетодов;

END;

Конкретную переменную, объявленную типом ИмяОбъекта, принято называть экземпляром этого типа.

Рассмотрим в качестве примера основные типы объектов для работы с символьной и текстовой информацией. При построении объектов всегда следует начинать с определения самого нижнего (элементарного) уровня данных и действий. Так, при работе с текстовой информацией на дисплее за нижний уровень представления данных можно принять позицию курсора (назовем ее ObjPos), определяемую двумя параметрами: номером строки (Line) и номером позиции в ней, т.е. столбцом (Col). Для задания позиции и символа объявляем процедуру Init, которая должна присваивать значения полям Line и Col, а для определения позиции вводим две функции: GetLine и GetCol (рис. 13.1). Метод Print не выполняет здесь никаких действий, но понадобится в дальнейших примерах.

ТУРЕ ObjPos = OBJECT Line: Word; { номер строки } Col: Word; { номер столбца } PROCEDURE Init(init_line, init_col: Word); FUNCTION GetLine: Word; { опрос Line } FUNCTION GetCol: Word; { опрос Col } PROCEDURE Print { зарезервировано } END; PROCEDURE ObjPos.Init(init_line, init_col: Word); BEGIN Line:= init_line; { метод задания номера строки } Col:= init_col; { метод задания номера столбца } END;

Рис. 13.1 {271}

FUNCTION ObjPos.GetLine: Word; BEGIN GetLine:= Line { метод опроса номера строки } END; FUNCTION ObjPos.GetCol: Word; BEGIN GetCol:= Col { метод опроса номера столбца } END; PROCEDURE ObjPos.Print; { "пустая" процедура вывода } BEGIN Write(#7); { это вызовет звуковой сигнал } END; VAR ObjPosVar: ObjPos; { объявление экземпляра объекта } (*Прочие описания типов, переменных, процедур, функций*) BEGIN { Пример вызова метода назначения позиции: } ObjPosVar.Init(5, 15); ... END.

Рис. 13.1 (окончание)

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

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

Объектный подход подразумевает, что объявляемый в программе объект содержит исчерпывающие данные о соответствующем «физическом» объекте, поэтому методы, объявляемые в объекте, должны по возможности обращаться только к друг другу и к полям {272} данных этого же объекта. В принципе, разрешается обращаться к полям экземпляра объекта, как к полям обыкновенной записи, и можно назначить позицию в тексте на рис. 13.1 простыми присваиваниями

ObjPosVar.Line:= 5;

ObjPosVar.Col:= 15;

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

При объявлении объектов должны выполняться следующие требования:

— описание типа «объект» может производиться только в блоке определения типов TYPE основной программы или в разделах модулей; нельзя описывать локальные объекты в подпрограммах;

— при описании типа объекта все поля данных должны находиться перед описаниями методов;

– компоненты объекта не могут быть файлами, а файлы, в свою очередь, не могут содержать компоненты типа «объект».

Данные типа «объект» не могут быть записаны в файл на диске. Тем не менее в демонстрационном архиве OOP.ARC пакета Турбо Паскаль приведены две программы: OBJECTS.PAS и ODEMO.PAS, которые совместно с находящимися там же ассемблерными вставками реализуют механизм хранения объектов на диске.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2022-11-01 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: