- •Лекции 26-27: Объекты и объектно-ориентированное программирование.
- •1.Принципы объектно-ориентированного программирования.
- •2. Концепция объекта в Турбо Паскале.
- •3. Свойства наследования и полиморфизма объектов.
- •4. Пример программы с использованием объектов.
- •Interface
- •Implementation
- •5. Понятие о динамических объектах.
- •6. Расширенное использование процедуры new.
- •7. Освобождение хип-памяти от динамических объектов.
Лекции 26-27: Объекты и объектно-ориентированное программирование.
1.Принципы объектно-ориентированного программирования.
2. Концепция объекта в Турбо Паскале.
3. Свойства наследования и полиморфизма объектов.
4. Пример программы с использованием объектов.
5. Понятие о динамических объектах.
6. Расширенное использование процедуры new.
7. Освобождение хип-памяти от динамических объектов.
1.Принципы объектно-ориентированного программирования.
Традиционным направлением развития программирования в течение многих лет было так называемое процедурное программирование, в основе которого лежит понятие процедуры (подпрограммы). В соответствии с этим направлением сложная программа строится из более мелких частей - процедур, осуществляя декомпозицию задачи на подзадачи и преодолевая сложность исходной задачи. Однако по мере увеличения сложности задачи растёт число процедур, и их использование требует (начиная от некоторого предела) собственной поддержки. Замечено, что если при процедурном подходе длина программы становится больше 1000-1500 строк, существенно возрастает сложность отладки такой программы. Таким образом, возникла потребность в качественно новом подходе в программировании. Этим подходом стало объектно-ориентированное программирование.
Основой объектно-ориентированного программирования является объект, под которым понимается не только соответствующая структура данных, но и связка процедур, обслуживающих эту структуру. Структура данных и связка процедур рассматриваются как единое целое, как бы заключенное в общую оболочку (капсулу). Все средства доступа к структурам данных объекта сосредоточены в этой капсуле (это свойство называется инкапсуляцией).
Объект является "строительным материалом" для объектно-ориентированной программы. Это накладывает соответствующий отпечаток и на методологию программирования: программист должен мыслить в терминах объектов предметной области и их взаимосвязи, а не в терминах изолированных процедур.
Объектно-ориентированное программирование не отрицает процедурный подход, а лишь поднимает его на более высокий уровень. Инкапсуляция - это декомпозиция процедур по функциональному принципу, вносящая существенную упорядоченность в использование процедур. Выигрыш от использования объектно-ориентированного подхода, тем выше, чем сложнее программа. В настоящее время многие программы строятся на базе объектно-ориентированного подхода, а для построения пользовательского интерфейса объектно-ориентированный подход является общепризнанным (он использован, в частности, в системах Turbo Vision и DELPHI).
2. Концепция объекта в Турбо Паскале.
В языке Турбо Паскаль (начиная с версии 5.5) введено новое понятие объекта, как дальнейшее развитие концепции типа. Как и типы, объекты должны быть описаны в разделе описаний программы. Форма описания объекта аналогична описанию типа Запись. Различие лишь в том, что ключевым словом описания является object, а не record, и кроме обычных полей (элементов структуры данных) в описании объекта используются процедурные поля - заголовки процедур и функций, инкапсулированных в данном типе объекта. Кроме того, возможности описания полей структуры данных расширены - могут описываться кроме переменных также необходимые типы данных, константы. Переменные, образующие структуру данных, называются полями объекта, а процедуры и функции - методами объекта. При этом тела методов должны быть описаны вне описания объекта: обычно в соответствующих модулях.
Некоторые поля и методы объекта можно объявить скрытыми от пользователей объекта с помощью директивы private (частный, скрытый), указываемой после общедоступной части описания объекта. Все поля и методы, описанные после private, доступны только внутри того модуля, где описан сам объект.
Пример описания объекта:
type point = object; {объект - точка на плоскости}
x,y: integer; {координаты точки}
c: byte; { цвет точки}
vis: boolean; { светимость}
procedure create(a,b:integer); {создание точки}
procedure move(dx,dy:integer); {сдвиг точки}
procedure setcolor(color:byte); {установка цвета}
procedure vis_on; {включить светимость}
procedure vis_off; {выключение светимости}
function getX:integer; {получить координату Х}
function getY:integer; {получить координату Y}
end {point};
Для работы с объектами помимо описания объекта, как и при описании других типов, необходимо объявить переменные типа объект, называемые экземплярами объектов. Например, для описанного выше объекта point можно объявить экземпляры: var p1,p2:point; {две точки}
Для обращения к полям и к методам объекта используются составные имена (имена с точкой), аналогично тому, как это принято для записей. Например: p1.X:=1; p1.Y:=p1.X; p2.X:=p1.getX; p1.SetColor(green);
Замечание |
В описании каждого типа-объекта неявно присутствует стандартное имя Self того же типа, что и сам объект. Это - обобщенное имя экземпляра объекта, которое может использовать любой метод для указания своей принадлежности этому объекту. |
Аналогично записям, доступ к полям и методам объекта можно упростить за счет использования оператора with.
Например: with p1 do begin x1:=getX; y1:=getY end;
Для объектов одного типа допустимо присваивание, например: p1:=p2;