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

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

Рубрика Программирование, компьютеры и кибернетика
Вид контрольная работа
Язык русский
Дата добавления 22.01.2013
Размер файла 51,7 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

TAnyClass = class (TParentClass)

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

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

end;

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

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

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

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

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

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

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

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

private

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

protected

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

public

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

published

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

end;

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

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

type

TColorCircle = class(TCircle);

FLeft,

FTop,

FRight,

FBottom: Integer;

Color: 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

CCircle1: TColorCircle;

begin

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

end;

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

Поля

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

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

type TNewClass = class(TObject)

private

FCode: integer;

FSign: char:

FNote: string;

end;

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

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

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

Свойства

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

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

type TNewClass = class(TObject)

private

FCode: integer;

FSign: char:

FNote: string;

published

property Code: integer read FCode write FCode;

property Sign: char read FSign write FSign;

property Note: string read FNote write FNote;

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

Методы

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

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

interface

type

TForm1 = class (TForm)

Button1: TButton;

procedure Button1Click (Sender: TObject);

end;

implementation

procedure TForm1. Button1Click (Sender: TObject);

begin

Close;

end;

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

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

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

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

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

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

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

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

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

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

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

type

TShape = class(TGraphicControl)

private

FPen: TPen;

procedure PenChanged(Sender: TObject);

public

constructor Create(Owner: TComponent); override;

destructor Destroy; override;

...

end;

// Описание конструктора Create класса TShape

constructor TShape.Create(Owner: TComponent);

begin

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

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

Height := 65;

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

FPen.OnChange := PenChanged;

end;

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

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

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

type

PMsg = ^TMsg;

Msg = packed record

hwnd: HWND;

message: UINT;

wParam: WPARAM;

lParam: LPARAM;

time: DWORD;

pt: TPoint

end;

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

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

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

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

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

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

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

PMessage = ^TMessage;

TMessage = record

Msg: Cardinal;

case Integer of

0: (

WParam: Longint;

LParam: Longint;

Result: Longint);

1: (

WParamLo: Word;

WParamHi: Word;

LParamLo: Word;

LPararoHi: Word;

ResultLo: Word;

ResultHi: Word);

end;

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

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

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

type

TForm1 = class(TForm)

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

procedure MyPaint(Var Param); message WM_Size;

end;

...

// Код метода обработки сообщения

procedure TForm1.MyPaint(Var Param);

begin

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

inherited;

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

Form1.Refresh;

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

Form1.Canvas.Pen.Color:=clRed;

Form1.Canvas.Brush.Style:=bsClear;

Form1.Canvas.Rectangle(0, 0, Form1.ClientWidth, Form1.ClientHeight);

end;

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

Application.OnIdle:=IdleWork;

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

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

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

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

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

Для посылки сообщения оконным элементам управления можно использовать функцию 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

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

end;

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

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

Button1.Caption:=TimeToStr(Now);

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

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

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

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

procedure TForm1.Button1Click(Sender: TObject);

begin

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

end; -

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

Размещено на Allbest.ru


Подобные документы

  • Изучение принципов объектно-ориентированного программирования, в котором основными концепциями являются понятия классов и объектов. Свойства этого вида программирования: инкапсуляция, полиморфизм, наследование. Описание класса. Конструкторы и деструкторы.

    презентация [74,8 K], добавлен 14.10.2013

  • Свойства объектно-ориентированного языка программирования. Понятия инкапсуляции и наследования. Виртуальные функции и полиморфизм. Инициализация экземпляра объекта с помощью конструктора. Динамическое создание объектов. Совместимость объектных типов.

    реферат [17,0 K], добавлен 15.04.2015

  • Использование объектно-ориентированного программирования - хорошее решение при разработке крупных программных проектов. Объект и класс как основа объектно-ориентированного языка. Понятие объектно-ориентированных языков. Языки и программное окружение.

    контрольная работа [60,1 K], добавлен 17.01.2011

  • Изучение принципов объектно-ориентированного программирования. Понятие класса в Delphi, в основе которых лежат три фундаментальные принципы - инкапсуляция, наследование и полиморфизм. Разработка классов транспортных средств и структур классов (кошки).

    курсовая работа [29,7 K], добавлен 29.10.2011

  • Объектно-ориентированное программирование как методология программирования, опирающаяся на инкапсуляции, полиморфизме и наследовании. Общая форма класса. Наследование как процесс, посредством которого один объект получает свойства другого объекта.

    презентация [214,9 K], добавлен 26.10.2013

  • Характеристики и свойства языков программирования. Исследование эволюции объектно-ориентированных языков программирования. Построение эволюционной карты механизмов ООП. Разработка концептуальной модели функционирования пользовательского интерфейса.

    курсовая работа [2,6 M], добавлен 17.11.2014

  • Методология объектно-ориентированного программирования в Java. Понятия класса, объекта и объектной переменной. Динамическая и статическая объектные модели. Логическое структурирование приложения. Наследование в Java. Отличия интерфейсов от классов.

    курс лекций [547,2 K], добавлен 01.05.2014

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

    курсовая работа [2,7 M], добавлен 04.05.2013

  • Понятие объектно-ориентированного программирования, характеристика используемых языков. Практическая разработка средств объектно-ориентированного программирования в задачах защиты информации: программная реализация на языке С++, а также Turbo Pascal.

    курсовая работа [275,9 K], добавлен 22.12.2011

  • Применение объектно-ориентированного программирования для написания нескольких модулей программы. Вычисление алгебраического уравнения методом половинного деления. Применение метода Эйлера в теории численных методов общих дифференциальных уравнений.

    курсовая работа [398,1 K], добавлен 26.02.2015

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.