Объектно-ориентированное программирование (ООП). Классы и объекты. Члены класса.




Класс (class) –это тип данных, включающий в себя группу данных различных типов (свойства) и методы работы с этими данными. Объект (object) –это экземпляр класса, обладающий набором свойств с заданными значениями. Свойство (property) –характеристика объекта, представленная в виде переменной, являющейся членом класса. Метод (method) –это подпрограмма, входящая в состав класса и управляющая данными объекта. Событие (event) – какое-либо происшествие в программе, системе, например, была нажата кнопка мыши. Поля данных -параметры объекта (конечно, не все, а только необходимые в программе), задающие его состояние (свойства объекта предметной области). Физически поля представляют собой значения (переменные, константы), объявленные как принадлежащие классу. Свойства объекта -псевдополя, доступные для чтения и/или записи. Свойства внешне выглядят как поля и используются аналогично доступным полям (с некоторыми исключениями), однако фактически при обращении к ним происходит вызов методов доступа. Методы -процедуры и функции, связанные с классом. Они определяют действия, которые можно выполнять над объектом такого типа, и которые сам объект может выполнять. Классы могут наследоваться друг от друга. Класс-потомок получает все поля и методы класса-родителя, но может дополнять их собственными либо переопределять уже имеющиеся. Конструктор —специальный блок инструкций, вызываемый при создании объекта. Некоторые языки программирования различают несколько особых типов конструкторов: 1.конструктор по умолчанию — конструктор, не принимающий аргументов; 2.конструктор копирования — конструктор, принимающий в качестве аргумента объект того же класса (или ссылку из него); 3.конструктор преобразования — конструктор, принимающий один аргумент. Деструктор —специальный метод класса, служащий для деинициализации объекта. Помимо объявлений элементов класса (полей, методов, свойств) описание класса, как правило, содержит несколько директив, которые устанавливают степень видимости элементов класса в программе. 1. Директива private. Поля, свойства и методы, описанные в разделе private, называются личными или закрытыми. Сюда помещаются элементы (чаще всего поля), которые выполняют в объекте специфичные функции и которые поэтому целесообразно скрыть от других частей программы, либо такие элементы, для которых по ряду причин не следует разрешать доступ извне объекта. 2. Директива public. Элементы, описанные в разделе public, называются общедоступными. Они могут быть использованы всюду в программе. Поля, свойства и методы, расположенные сразу после заголовка класса, при выключенной директиве компилятора {$M-}, по умолчанию принимаются общедоступными. 3. Директива protected. Элементы класса, объявленные в разделе protected (защищенный), доступны только в классах, порожденных от исходного. Здесь размещаются элементы, которые важны лишь для функционирования объектов данного класса и его потомков. Обычно в секцию protected помещаются описания методов класса. 4. Директива published. Поля, свойства и методы, описанные в разделе published, называются опубликованными. Их область видимости эквивалентна области видимости общедоступных описаний. Отличие состоит в том, что информация о них, за исключением ряда типов, например real, на этапе проектирования программы помещается в инспектор объектов. Описания, расположенные сразу после заголовка класса, при включенной директиве компилятора {$M+}, по умолчанию принимаются опубликованными. 5. Директива automated. Элементы класса, объявленные в разделе automated, называются автоматическими. Их область видимости эквивалентна области видимости общедоступных описаний. Отличие состоит в том, что для автоматических свойств и методов генерируется дополнительная информация, которая используется для реализации OLE-механизма. Использовать директиву automated имеет смысл при объявлении потомков стандартного класса TAutoObject. Типизация - это способ защититься от использования объектов одного класса вместо другого, или, по крайней мере, руководить таким использованием. Типизация вынуждает выражать абстракции так, чтобы язык программирования, который используется в реализации, поддерживал соблюдение принятых проектных решений. Для получения и передачи данных в классе применяются свойства. Для объявления свойств в классе используется зарезервированное слово property. Свойства представляют собой атрибуты, которые составляют индивидуальность объекта и помогают описать его. Например, обычная кнопка в окне приложения обладает такими свойствами, как цвет, размеры, положение. Для экземпляра класса "кнопка" значения этих атрибутов задаются при помощи свойств — специальных переменных, определяемых ключевым словом property. Так как свойство обеспечивает обмен данными с внешней средой, то для доступа к его значению используются специальные методы класса. Поэтому обычно свойство определяется тремя элементами: полем и двумя методами, которые осуществляют его чтение/запись:

type

TAnObject = class(TObject)

function GetColor: TSomeType;

procedure SetColor(ANewValue: TSomeType);

property AColor: TSomeType read GetColor write SetColor;

end;

Свойство, чье описание включает только спецификатор read, является свойством только для чтения. При попытке присвоить значение свойству только для чтения возникает ошибка либо просто ни чего не происходит. Методы по своим целям и предназначениям делятся: 1) Конструкторы - это методы, нужные для непосредственной инициализации начального состояния объектов. Данный метод вызывается при создании объекта, может также принимать различные параметры на вход, тем самым, конструируя различным образом объекты. 2) Деструкторы - это методы, которые вызываются непосредственно при уничтожении объектов. Предназначенны для освобождения различных занятых ресурсов удаляемым объектом, например, очистка памяти от внутренних переменных, разъединение задействованных подключений. 3) Геттеры (Селекторы) - это специальные методы (по внешнему виду не отличающиеся от обычных методов) целью которых является предоставление доступа к данным внутри объекта, нужны как правило для того, чтобы предоставлять информацию в какой-то обработанной форме, либо, для того чтобы составить пару методу-сеттеру. 4) Сеттеры (Модификаторы) - это методы которые изменяют состояния объектов, нужны для того, чтобы исключить непосредтвенный доступ пользователя объекта к данным внутри класса.

Обработчик события TButton.OnClick в Delphi:

type

TNotifyEvent = procedure(Sender: TObject) of object;

TControl = class(TComponent)

private

FOnClick: TNotifyEvent;

protected

procedure Click; dynamic;

property OnClick: TNotifyEvent read FOnClick write FOnClick;

end;

procedure TControl.Click;

begin

if Assigned(FOnClick) then FOnClick(Self);

end;

Класс TButton наследуется от TControl. и публикует свойство OnClick. Object Inspector, видя свойство процедурного типа, размещает его на странице обработчиков событий. При нажатии на кнопку класс TButton вызывает метод Click, и тот вызывает соответствующий обработчик события, если последний присвоен.

 

Принципы ООП

Полиморфизм —это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. Пусть есть класс "Transport". У него есть местоположение, и он умеет двигаться.

TTransport = class

X, Y, Speed: Double;

procedure Move; virtual;

end;

От класса "Transport" породим автомобиль:

TCar = class(TTransport)

procedure Move; override;

end;

И самолёт:

TAirCraft = class(TTransport)

Z: Double;

procedure Move; override;

end;

Ясно, что самолёт и автомобиль движутся по-разному, сохраняя при этом какие-то общие черты. Т.е. на языке ООП общая черта - это метод предка Move, который закладывает общие принципы движения любого "Transport", которое будет от него порождено, будь то самолёт, машина или пароход. Но то, как именно будет двигаться потомок, знает только потомок, и изменяет (перекрывает) свой метод так, чтобы учесть эту специфику.

var

Transport1: TTransport;

Transport2: TTransport;

begin

Transport1:= TCar.Create;

Transport2:= TAirCraft.Create;

Transport1.Move; //вызовется метод TCar.Move несмотря на то, что Transport1 типа TTransport а не Tcar. Т.е. предок "Transport" может принять форму любого своего потомка с сохранением поведения этого потомка

end;

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

TMyClass = class

private

FMyField: Integer;

procedure SetMyField(const Value: Integer);

function GetMyField: Integer;

public

property MyField: Integer read GetMyField write SetMyField;

end;

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

Для использования механизма наследования в Delphi необходимо в объявлении класса справа от слова class указать класс предок.

Предок:

TAncestor = class

private

protected

public

// Виртуальная процедура

procedure VirtualProcedure; virtual; abstract;

procedure StaticProcedure;

end;

Наследник:

TDescendant = class(TAncestor)

private

protected

public

// Перекрытие виртуальной процедуры

procedure VirtualProcedure; override;

procedure StaticProcedure;

end;

Абсолютно все классы в Delphi являются потомками класса TObject. Если класс-предок не указан, то подразумевается, что новый класс является прямым потомком класса TObject.

Свойство базового класса можно перекрыть (override) в производном классе, например чтобы добавить ему новый атрибут доступа или связать с другим полем или методом. Метод базового класса тоже можно перекрыть в производном классе, например чтобы изменить логику его работы. Переопределение метода реализует в языке Delphi концепцию полиморфизма ООП. Оно позволяет изменить поведение метода от потомка к потомку. Переопределены могут быть только те методы, которые ранее были объявлены вмртуальными (virtual), динамическими (dynamic) или обраки сообщения (message).

 

14. ООП. Компоненты Delphi.

DELPHI содержит сложную иерархию классов, которые можно использовать в программе, создавая объекты этих классов или формируя-классы потомки. В начале этой иерархии стоят классы, называемые абстрактными классами. Для них нельзя создать полноценные работающие объекты, но они являются родоначальниками целых семейств классов, для которых такие объекты уже могут быть созданы. Исходя из свойства наследования, в абстрактных классах помещены характеристики, присущие всем классам их семейств. Класс TObject является предком всех других классов, используемых в DELPHI. Он включает в себя характеристики, свойственные всем используемым классам. Некоторые методы класса TObject могут использоваться без создания соответствующих объектов с учетом того, что реального объекта такого класса может и не быть. Эти методы позволяют получить общие характеристики класса – адрес таблицы, содержащей характеристики класса, имя класса и т. д. Примеры некоторых методов класса TObject: ClassName – функция класса (типа ShortString) формирует строку, содержащую имя класса, данное ему при создании. Класс TPersistent (Постоянный) является потомком класса TObject и предком всех классов, объекты которых могут быть помещены в память и взяты из памяти. Основными потомками являются классы: TComponent – предок всех компонент проекта; TStrings – предок всех списков строк; TCollection – коллекция (список) элементов; TGraphicObject, TCanvas, TGraphic, TPicture – классы, образующие так называемый графический инструментарий DELPHI. Класс TControl является родоначальником всех элементов управления, с помощью которых выводится информация на экран и с помощью которых можно вводить информацию в программу, используя клавиатуру и мышь. Его потомок класс TWinControl служит для создания окон Windows. Методы базового класса Tobject позволяют легко получать информацию о характеристиках созданного класса и его потомках. Динамически создаваемые компоненты - это компоненты, место в памяти под которые выделяется по мере необходимости в процессе работы приложения. Этим они и отличаются от компонентов, которые помещаются на Форму при проектировании приложения. Все компоненты, как объекты, имеют множество свойств, определяющих их работу. При установке компонента на Форму из палитры большинство этих свойств определяются системой Delphi автоматически.

Run-time type information (RTTI) - это специальный механизм определения типа объекта во время выполнения. Чаще всего это актуально для определения типа объекта по указателю. Многие каркасные библиотеки самостоятельно поддерживают этот мехзанизм. В том числе и VCL. Событийно-ориентированное программирование — парадигма программирования, в которой выполнение программы определяется событиями — действиями пользователя (клавиатура, мышь), сообщениями других программ и потоков, событиями операционной системы. Обработка сообщений означает, что приложение будет тем или иным образом реагировать на полученные от операционной системы сообщения. Нужно объявить процедуру в частных объявлениях (в области Private объекта TForm1):

procedure WMPaint(var Msg: TWMPaint); message wm_Paint;

В разделе implementation модуля добавляем определение процедуры:

procedure TForm1.WMPaint(var Msg: TWMPaint);

begin

beep;

inherited;

end;

Функция DefWindowProc обеспечивает стандартную обработку сообщений для сообщений, которые явно не обрабатываются прикладной задачей. Среда Delphi хранит для каждого компонента имена всех его обработчиков событий и выводит их на экран в окне "Инспектор объектов" (Object Inspector) во вкладке "События" (Events). Параметр Sender - присутствует в каждом обработчике событий любого компонента. Sender имеет тип TObject, и имеет значение объекта - источника события, в обработчике которого он используется. То есть, если на Форме находится несколько одинаковых компонентов, к тому же выполняющих одинаковые функции, то нет необходимости для каждого из них создавать свои процедуры-обработчики событий. Выяснить, к какому компоненту относится событие, обрабатываемое именно сейчас, позволит именно параметр Sender.

procedure TForm1.Button1Click(Sender: TObject);

begin

end;



Поделиться:




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

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


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