Объекты

Begin

Var

Type

TMyClass= class (TObject)

Field: Integer;

......

end;

MyClass: TMyClass;

......

MyClass^.Field:=0; // Ошибка! Следует писать так:

MyClass.Field:=0;

end;


Важнейшие принципы объектно-ориентированного программирования.

Классы - это особое «изобретение» программистов для упрощения разработки сложных программ и улучшения их качества. В основе классов лежат 3 фундаментальных принципа, которые называются:

1. инкапсуляция

2. наследование

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

Инкапсуляция.

Как выше было сказано класс это единство 3х сущностей: полей, методов и свойств.

Определение: Объединение 3х сущностей (полей, методов, свойств) в абстрактных типах данных, называемых классы объектов, в единое целое называется инкапсуляцией.

Инкапсуляция означает объединение данных и действий над ними в одном объектном типе.

Инкапсуляция позволяет изолировать класс от остальных частей программы, сделать его самодостаточным для решения конкретной задачи. В результате класс всегда несет в себе некоторую функциональность. Например, класс TForm содержит (или инкапсулирует) в себе все необходимое для создания Windows – окна, класс TMemo представляет собой полнофункциональный текстовый редактор.

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

Т.о. библиотека классов Delphi это фактически набор кирпичиков созданных программистами – разработчиками для построения программ пользователей.


Наследование.

Любой класс может быть порожден от другого класса, для этого при его объявлении указывается имя класса – родителя:

TChildClass= class (TParentclass)

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

TClass= class (TObjeсt)

TClass= с lass

Принцип наследования приводит к созданию ветвящегося дерева классов от TObject к его потомкам, каждый потомок дополняет возможности родителя новыми возможностями и передает их своим потомкам.

Рассмотрим небольшой фрагмент дерева классов Delphi. Класс TPersistent обогащает возможности своего родителя TObject: он «умеет» сохранять данные в файле и получать их из него, в результате это умеют делать и все его потомки. Класс TComponent, в свою очередь, умеет взаимодействовать со средой разработчика и передавать это умение своим потомкам. ТControl не только способен работать с файлами и средой разработчика, но он еще умеет создавать и обслуживать видимые на экране изображения, а его потомок TWinControl – создавать Windows-окна и т.д.


TObject

 
 


TInterfaceObject Exception

TPersistent

TComponent

TControl

TWinControl

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

Полиморфизм – это свойство классов решать схожие по смыслу проблемы разными способами.

В рамках Object Pascal поведенческие свойства класса определяются набором входящих в него методов.

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

Составляющие класса.

Составляющими класса являются поля, методы, свойства.

Поля

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

<имя объекта>.< имя поля>

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

Например:

type

Тcomp=class

re,im:real

end;

var a:Тcomp;

begin … … …

a.re:= 6.5;

a.im:=-10.5;

… … …

end.

Т comp – имя класса, содержащего два поля: re и im, a – объект класса Тcomp (т.е. переменная комплексного типа), ее значениями являются пары вещественных чисел – действительная и мнимые части.

В объектно-ориентированном программировании прямой доступк полям объекта нежелателен. Чтение и обновление их содержимого должно производится вызовом соответствующих методов. В Delphi у всех стандартных классов все поля недоступны и заменены базирующимися на них свойствами.

При создании новых классов на базе ранее созданных класс-потомок наследует все поля класса-родителя. Удаление и переопределение полей родителя невозможно. Можно добавлять новые поля в классе-потомке.

Например: type

TPerson = class

fam: string

end;

TStudent = class (TPerson)

grup: integer

end;

var x:TStudent;

Таким образом объект х имеет два поля: поле fam, наследуемое от класса TPerson и свое поле grup.

Класс – потомок получает все поля всех своих предков и может дополнять их своими, но не может переопределять их или удалять.

Т.о. чем ниже в дереве иерархии располагается класс, тем больше данных получают в свое распоряжение его объекты. Отметим, что почти все классы имеют имена, начинающиеся с буквы T (от слова Type).

Методы

Метод – это процедура или функция, описанная в классе и предназначенная для операции над полями.

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

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

Procedurе < имя класса>.< имя метода> (<формальные параметры>);

Function <имя класса>.<имя метода> (<формальные параметры>):

< тип функции>;

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

При вызове метода класса записываются составные имена вида:

< имя объекта>.< имя метода>

При вызове метода указываются фактические параметры, если этот метод имел формальные параметры при описании.

Например:

Type ТСomp=class

re, im: real; { поля класса ТСomp }

procedure Add(z:Tcomp);

function Modul:real; { методы класса ТСomp }

………

end;

{ затем в разделе var описываются объекты a, b }

Var a, b:ТComp;

Begin

………

a. Add(b);

{ объект а вызывает метод Add с фактическим параметром b }

b. Modul;

{ объект b вызывает метод Modul }

………

End.

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

Например:

Type ТСomp = class

re,im: real;

… … …

procedure set (x,y: real); {метод записи в поле, т.е. присвоения }

end; {значений x,y полям re и im }

procedure ТСomp.set; {сокращенный заголовок метода, без параметров}

begin

re:=x;

im:=y;

end;

var a,b: ТСomp;

begin … … …

a.set (-5,10);

b.set (1.3,13.8);

… … …

end.

В Delphi объект – динамическая структура. Переменная объект содержит не данные, а ссылку на данные объекта, то есть переменные a,b являются указателями, содержащими адреса объектов. Поэтому программист должен позаботиться о выделении памяти для этих данных. Форма обращения к объектам классов в Object Pascal отличается от формы обращения к другим указателям и динамическим переменным. Для обращения к полям и методам объекта в Object Pascal не надо использовать «^».

Таким образом класс и объект этого класса описываются:

Type

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

{поля, методы, свойства}

end;

{описания методов класса}

Var

<имя объекта>: <имя класса>;


Создание и уничтожение объектов.

В состав любого класса входят два специальных метода: конструктор и деструктор. Эти методы у класса TObject называются Create и Destroy, так же они называются и в большинстве его потомков.

Определение: Конструктор – специальный метод, который распределяет объект в динамической памяти и помещает адрес начальной ячейки памяти в переменную Self, которая автоматически объявляется в классе.

Определение: Деструктор – специальный метод, который удаляет объект из динамической памяти.

Обращение к конструктору должно предшествовать любому обращению к полям и методам объекта. Т.о. объект «появляется на свет» в результате вызова конструктора Create, который инициализирует объект.

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

Delphi осуществляет инициализацию полей класса: все числовые поля инициализируются нулем, строковые – пустой строкой, логические – значением false, указатели – значением nil.

Для вызова конструктора необходимо записать:

< имя объекта>:= <имя класса>.<имя конструктора>;

Нужно указать еще и фактические параметры, если они есть.

Например:

a:= ТСomp. Create;

Здесь появляется объект a.

Внимание! Как же так, ведь объекта еще нет, а мы уже вызываем его метод. Обратим внимание на то, что вызывается метод ТСomp.Create, а не a. Creatе.

Для освобождения памяти, занятой объектом, используется специальный метод – деструктор, который обычно имеет имя Destroy.

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

< имя объекта>.< имя деструктора>;

Например: a.destroy;

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

Type TMyClass=class

IntField:Integer;

Constructor Create(а:integer);

Destructor Destroy;

end;

Любые поля объекта, а так же методы класса, оперирующие с его полями, могут вызываться только после создания объекта с помощью вызова конструктора:

var a: ТСomp;

begin a.re:=0;{ошибка, объект пока не создан}

a:= ТСomp. Create; {создается объект a}

a.re:=0;

.....

a. destroy; {уничтожение объекта}

end.

Обращение к деструктору объекта будет ошибочным, если объект не создан конструктором и если адрес объекта nil, поэтому для удаления объекта следует вызвать метод free, который сначала проверяет, не равен ли адрес объекта nil, а затем вызывает метод destroy.

Например: a. free; – уничтожение объекта.

Методы destroy, create есть и у общего предка всех классов TObject, поэтому если в классе-потомке не указан конструктор или деструктор, то он наследуется от общего класса-родителя.

Например:

type

Тcomp = class

re,im:real;

procedure input (x,y:real);

{конструктор и деструктор явно }

..... { не указаны, они наследуются от класса TObject }

end;

procedure Тcomp.input;

begin re:=x;

im:=y;

end;

var a,b:Тcomp;

begin

a:= Тcomp.create; {вызывается конструктор}

a.input (6,10);

.....

a.free {вызывается деструктор}

end.



Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: