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

  • Вид работы:
    Контрольная работа
  • Предмет:
    Информационное обеспечение, программирование
  • Язык:
    Русский
    ,
    Формат файла:
    MS Word
    11,94 Кб
  • Опубликовано:
    2013-01-22
Вы можете узнать стоимость помощи в написании студенческой работы.
Помощь в написании работы, которую точно примут!

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

Понятие объектно-ориентированного программирования

объективный ориентированный программирование

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

ООП представляет собой отличный от процедурного способ программирования, который напоминает процесс человеческого мышления. В ООП главной отправной точкой при проектировании программы является объект. При структурном подходе описываемый объект обычно разделяется на составные части.

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

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

Принципы объектно-ориентированного программирования

К основным принципам ООП относятся следующие:

инкапсуляция;

наследование;

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

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

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

После того, как объектный тип объявлен, можно создавать переменные этого типа, или экземпляры объекта.

После того как экземпляр объекта создан, его поля становятся доступными для методов.

Таким образом, инкапсуляция - это объединение записей с процедурами и функциями, что превращает их в новый тип данных - объект.

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

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

Наследование - это использование объекта для построения иерархии порожденных объектов с наследованием доступа каждого из порожденных объектов к коду предка.

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

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

Пример объявления нового класса:

TAnyClass = class (TParentClass)

// Добавление к классу TParentClass новых

//и переопределение существующих элементов

end;

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

Таким образом, процесс, с помощью которого один тип наследует характеристики другого типа, называется наследованием. Наследование объектов аналогично общепризнанному понятию наследования, когда определяется новый объект, как потомок уже существующего объекта, то утверждается, что потомок по большей части такой же как и предок. К объекту-потомку в случае необходимости могут быть объявлены новые поля, новые методы и перекрыты уже существующие методы предка. Эти добавления и изменения определяют только то, в чем потомок отличается от предка.

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

Сущность полиморфизма заключается в том, что методы различных классов могут иметь одинаковые имена, но различное содержание. Это достигается переопределением родительского метода в классе-потомке: В результате родитель и потомок ведут себя по-разному. При этом обращение к одноименным методам различных объектов выполняется аналогично.

Классы и объекты. Поля, свойства и методы

Классы и объекты

В языке Object Pascal классы - это специальные типы данных, используемые для описания объектов. Соответственно объект, имеющий тип какого-либо класса, является экземпляром (instance) этого класса или переменной этого типа. Класс представляет собой особый тип записи, имеющий в своем составе такие элементы (члены, member), как поля, свойства и методы. Лом класса аналогичны полям записи и служат для хранения информации об объекте. Методами называются процедуры и функции, предназначенные для обработки полей. Свойства занимают промежуточное положение между полями и методами. С одной стороны, свойства можно использовать как поля, например, присваивая им значения с помощью инструкции присваивания; с другой стороны, внутри класса доступ к значениям свойств выполняют методы класса. Описание класса имеет следующую структуру:

Туре <Имя класса> = class (<Имя класса-родителя>)

private

<Частные описания>;

protected

<Защищенные описания>;

public

<Общедоступные описания>;

published

<Опубликованные описания>;

end;

В приведенной структуре описаниями являются объявления свойств, методов и событий.

Пример описания класса:

type

TColorCircle = class(TCircle);

FLeft,,,: Integer;: TColor;

end;

Здесь класс TColorCircle создается на основе родительского класса TCircle. По сравнению с родительским, новый класс дополнительно содержит четыре поля типа Integer и одно поле типа TColor.

Если в качестве родительского используется класс TObject, который является базовым классом для всех классов, то его имя после слова Class можно не указывать. Тогда первая строка описания будет выглядеть так: type TNewClass = class

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

Разделы private и protected содержат защищенные описания, которые доступны внутри модуля, в котором они находятся. Описания из раздела protected, кроме того, доступны для порожденных классов за пределами названного модуля.

Раздел public содержит общедоступные описания, которые видимы в любом месте программы, где доступен сам класс.

Раздел published содержит опубликованные описания, которые в дополнение к общедоступным описаниям порождают динамическую (т.е. во время выполнения программы) информацию о типе (Run-Time Type Information, RTTI). По этой информации при выполнении приложения производится проверка на принадлежность элементов объекта тому или иному классу. Одним из назначений раздела published является обеспечение доступа к свойствам объектов при конструировании приложений. В Инспекторе объектов видны те свойства, которые являются опубликованными. Если спецификатор published не указан, то он подразумевается по умолчанию, поэтому любые описания, расположенные за строкой с указанием имени класса, считаются опубликованными. Объекты как экземпляры класса объявляются в программе в разделе var как обычные переменные. Например:

var

CCircle1: TColorCircle;

CircleA: TCircle;

Как и в случае записей, для обращения к конкретному элементу объекта (полю, свойству или методу) указывается имя объекта и имя элемента, разделенные точкой, т.е. имя элемента является составным.

Пример обращения к полям объекта:

var: TColorCircle;.FLeft:=5; CCircle1.FTop:=1;;

Здесь приведено непосредственное обращение к полям объекта, обычно это делается с помощью методов и свойств класса.

Поля

Поле класса представляет собой данные, содержащиеся в классе. Поле описывается как обычная переменная и может принадлежать к любому типу.

Пример описания полей:

TNewClass = class(TObject): integer;: char:: string;;

Здесь новый класс TNewClass создается на основе базового класса TObject и получает в дополнение три новых поля FCode, FSign и FNote, имеющих, соответственно, целочисленный, символьный и строковый типы. Согласно принятому соглашению имена полей должны начинаться с префикса F (от англ. Field - поле).

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

Напомним, что изменение значений полей обычно выполняется с помощью методов и свойств объекта.

Свойства

Пример описания свойств:

type TNewClass = class(TObject)

private: integer;: char:: string;Code: integer read FCode write FCode;Sign: char read FSign write FSign;Note: string read FNote write FNote;

Для доступа к полям FCode, FSign и FNote, которые описаны в защищенном разделе и недоступны для других классов, используются свойства Code, Sign и Note соответственно.

Методы

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

Например, описание метода Button1Click будет выглядеть так:

interface= class (TForm): TButton;Button1Click (Sender: TObject);;TForm1. Button1Click (Sender: TObject);

Close;

end;

Метод, объявленный в классе, может вызываться различными способами, что зависит от вида этого метода. Вид метода определяется модификатором, который указывается в описании класса после заголовка метода и отделяется, от заголовка точкой с запятой. Приведем некоторые модификаторы:

JVirtual - виртуальный метод;

JDynamic - динамический метод;

JOverride - переопределяемый метод;

JMessage - обработка сообщения;

JAbstract - абстрактный метод.

По умолчанию все методы, объявленные в классе, являются статическими и вызываются как обычные подпрограммы.

Методы, которые предназначены для создания или удаления объектов, называются конструкторами и деструкторами соответственно. Описания данных методов отличаются от описания обычных процедур только тем, что в их заголовках стоят ключевые слова constructor и destructor. В качестве имен конструкторов и деструкторов в базовом классе TObject и многих других классах используются имена Create и Destroy.

Прежде чем обращаться к элементам объекта, его нужно создать с помощью конструктора. Например: ObjectA := TOwnClass.Create;

Конструктор выделяет память для нового объекта в "куче" (heap), задает нулевые значения для порядковых полей, значение nil - для указателей и полей-классов, строковые поля устанавливает пустыми, а также возвращает указатель на созданный объект.

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

type

TShape = class(TGraphicControl)

private: TPen;PenChanged(Sender: TObject);Create(Owner: TComponent); override;Destroy; override;

...;

// Описание конструктора Create класса TShapeTShape.Create(Owner: TComponent);

inherited Create(Owner); // Инициализация унаследованных частей

Width := 65; // Изменение унаследованных свойств

Height := 65;

FPen := TPen.Create; // Инициализация новых полей

FPen.OnChange := PenChanged;

end;

В конструкторе класса-потомка сначала вызывается конструктор родителя, а затем выполняются остальные действия. В классе-потомке директива override (переопределить) обеспечивает возможность родительскому классу использовать новый метод. Ключевое слово inherited служит для вызова методов родительского класса.

Сообщения и события

В основе операционной системы Windows лежит использование механизма сообщений, которые "документируют" все производимые действия, например, нажатие клавиши, передвижение мыши или тиканье таймера. Приложение получает сообщение в виде записи заданного типа, определяемого как:

type= ^TMsg;= packed record

hwnd:HWND;:UINT;:WPARAM;: LPARAM;: DWORD;: TPoint

end;

Поля этой записи содержат следующую информацию:

Jhwnd - дескриптор управляющего элемента, которому предназначено сообщение;

Jmessage - код сообщения;

JwParam и lParam - дополнительная информация о сообщении;

Jtime - время обработки сообщения Windows;

Jpt - координаты указателя мыши во время генерации сообщения.

Система Delphi преобразовывает сообщение в свой формат, для которого используется запись следующего типа:

PMessage = ^TMessage;= record: Cardinal;Integer of

: (: Longint;: Longint;: Longint);

: (: Word;: Word;: Word;: Word;: Word;: Word);;

Типы Msg, TMessage, а также константы, используемые при посылке сообщений, описаны в файлах Windows.pas и Message.pas.

Для обработки сообщений, посылаемых ядром Windows и различными приложениями, используются специальные методы, описываемые с помощью модификатора Message, после которого указывается идентификатор сообщения. Метод обработки сообщения обязательно должен быть процедурой, имеющей один параметр, который при вызове метода содержит информацию о поступившем сообщении. Имя метода программист выбирает самостоятельно, для компилятора оно не имеет значения, т.к. данный метод является динамическим и его вызов выполняется по таблице динамических методов. Метод может полностью или частично перекрывать метод-предок, который обрабатывает это сообщение. Если метод только модифицирует метод-предок, то для вызова последнего используется метод inherited. При этом не нужно указывать имя метода-предка и его параметры, т. к. вызов будет выполнен автоматически.

Рассмотрим в качестве примера обработку сообщения Windows, посылаемого при изменении размеров окна.

type

TForm1 = class(TForm)

// Объявление метода обработки сообщения

procedure MyPaint(Var Param); message WM_Size;;

...

// Код метода обработки сообщенияTForm1.MyPaint(Var Param);

// Вызов метода-предка

inherited;

// Очистка поверхности формы

Form1.Refresh;

// Вывод красной рамки

Form1.Canvas.Pen.Color:=clRed;

Form1.Canvas.Brush.Style:=bsClear;.Canvas.Rectangle(0, 0, Form1.ClientWidth, Form1.ClientHeight);;

По периметру формы выводится красная рамка с помощью процедуры MyPaint, которая является обработчиком сообщения WMSize. Это сообщение посылается при изменении размеров окна. В данном примере рамка перерисовывается (вместе с формой) только при изменении размеров окна, но не при его перекрытии другими окнами, т.к. в этом случае посылается сообщение WMPaint, которое здесь не анализируется. Параметр Param процедуры нигде не используется, однако должен быть указан в заголовке процедуры. Обычно в Delphi не требуется обязательная обработка непосредственных сообщений Windows, т.к. в распоряжение программиста предоставляются события, работать с которыми намного проще и удобнее. Событие представляет собой свойство процедурного типа, предназначенное для обеспечения реакции на те или иные действия. Присваивание значения этому свойству (событию) означает указание метода, вызываемого при наступлении события. Соответствующие методы называются обработчиками событий. Пример назначения обработчика события:

Application.OnIdle:=IdleWork;

В качестве обработчика события OnIdle, возникающего при простое приложения, объекту приложения назначается процедура IdleWork. Поскольку объект Application доступен только при выполнений приложения, такое присваивание нельзя выполнить через Инспектор объектов.

События Delphi имеют различные типы, зависящие от вида этого события. Самым простым является тип TNotlfyEvent, характерный для нотификационных (уведомляющих) событий. Этот тип описан следующим образом:

type TNotifyEvent = procedure (Sender: TObject) of object;

и содержит один параметр Sender, указывающий объект-источник события. Многие события более сложного типа, наряду с другими параметрами, также имеют параметр Sender.

Для посылки сообщения оконным элементам управления можно использовать функцию SendMessage. Посылка сообщения может понадобиться в случае, когда компонент через свои свойства не предоставляет всех своих возможностей. Например, список ListBox не имеет свойств, напрямую управляющих горизонтальной полосой прокрутки. Поэтому для отображения и скрытия горизонтальной полосы прокрутки можно послать списку соответствующее сообщение.

Функция SendMessage (hwnd: HWND; Msg: Cardinal; WParam, LParam: Longint): Longint посылает сообщение оконному элементу управления, ссылка (дескриптор) на который задана параметром hwnd. В Delphi дескриптор оконного элемента содержит свойство Handle. Параметр Msg указывает код сообщения, а параметры WParam и LParam содержат дополнительную информацию о сообщении, и их значения зависят от конкретного сообщения.

Рассмотрим следующий пример:

Label1.Caption:=IntToStr(SendMessage(ListBox1.Handle, LB_GetCount, 0, 0));

Здесь списку ListBox1 посылается сообщение LB_GetCount которое предписывает списку выдать число его элементов. Для доступа к списку используется его дескриптор, значение которого содержит свойство Handle. Так как для данного сообщения дополнительная информация не требуется, значения двух последних параметров равны нулю.

Число элементов списка можно получить также через подсвойство Count свойства Items списка.

Динамическая информация о типе

Объекты содержат динамическую информацию о собственном типе (RTTI, Run-Time Type Information) и наследовании, которая доступна во время выполнения программы и которую можно использовать, например, для проверки принадлежности объекта к тому или иному типу. Поскольку для каждого объекта допустимы только определенные операции, зависящие от его типа, такая проверка позволяет предотвратить опасные ситуации, связанные с выполнением недопустимых действий.

Большинству методов при вызове передается параметр Sender, имеющий тип TObject. Для выполнения с этим параметром операций, таких как, например, вызов метода или присваивание значения свойству, его необходимо привести к типу того объекта, для которого выполняются эти операции. Различают явное и неявное приведение (преобразование) типов.

Для операций с типами в языке Object Pascal служат инструкции is и as. Инструкция is используется в выражении

<Объект> is <Класс>

и проверяет, принадлежит ли объект указанному классу или одному из его потомков. Если да, то это выражение имеет значение True, что указывает на совместимость типов. В противном случае выражение имеет значение False.

Инструкция as предназначена для приведения одного типа к другому и используется в выражении вида

<Объект> as <Класс>

В этом выражении объект приводится к типу класса, такое приведение типа является неявным. Рассмотрим следующий пример неявного приведения типа:

procedure TForm1.Button1Click(Sender: TObject);

begin(Sender is TButton) then (Sender as TButton).Caption := TimeToStr(Now);;

Здесь при нажатии кнопки Button1 в ее заголовке отображается текущее время. Для доступа к объекту кнопки и его свойству Caption используется параметр Sender, тип которого приводится к типу TButton кнопки. Предварительно выполняется проверка, можно ли выполнить подобное приведение типа.

Если обработчик предназначен только для кнопки Button1, то изменение заголовка кнопки проще выполнить с помощью инструкции вида

Button1.Caption:=TimeToStr(Now);

Использование параметра Sender и, соответственно, приведение типа может оказаться необходимым в случаях, когда процедура обработки является общей для нескольких компонентов, в том числе разных типов.

Явное приведение типа выполняется с помощью следующей конструкции:

<Тип>(<Объект>)

Пример явного приведения типа:

procedure TForm1.Button1Click(Sender: TObject);

(Sender).Caption:='Кнопка';; -

Заголовок компонента, нажатого пользователем, заменяется заголовком кнопка. Для выполнения присваивания тип компонента приводится к типу TButton.

Похожие работы на - Объектно-ориентированное программирование

 

Не нашли материал для своей работы?
Поможем написать уникальную работу
Без плагиата!