Конструктор. Деструктор.




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

type
<имя класса1> = class
<описание полей класса>;
constructor Create(<параметры>);
begin
<тело конструктора-могут быть инициализированы поля класса>

end;
end;

 

В PascalABC.NET конструктор всегда должен иметь имя Create. При описании конструктора внутри класса можно опускать его имя. в PascalABC.NET всегда создается конструктор без параметров (независимо от того, определен ли другой конструктор). Этот конструктор инициализирует все поля нулевыми значениями (строковые поля - пустыми строками, логические - значением False).

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

1 способ. В стиле Object Pascal.

Для вызова конструктора следует указать имя класса, за которым следует точка-разделитель, имя конструктора и список параметров. Например:

var p: Person;
p:= Person.Create('Иванов',20);

2 способ. С помощью операции new - в стиле C# (предпочтительный).

var p: Person;
p:= new Person('Иванов',20);

Деструктор в Object Pascal - специальная процедура, уничтожающая объект и освобождающая динамическую память, которую этот объект занимал. При описании деструктора вместо служебного слова procedure используется служебное слово destructor.

Например:

 

destructor Destroy;
begin
...
end;

 

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

 

 

14. Методы:

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

Определение методов можно давать как внутри класса (стиль Java, C#, C++), так и вне класса (стиль Delphi, C++). При определении метода вне интерфейса класса его имя предваряется именем класса с последующей точкой. Например:

type
<имя класса1> = class
<описание полей класса>;
constructor Create(<параметры>);
begin
<тело конструктора>

end;
function <метод1>: integer;
end;

function <имя класса1>.<метод1>: integer;
begin
<тело метода>
end;

Методы делятся на классовые и экземплярные. Классовые методы в .NET называются статическими. Объявление классового метода начинается с ключевого слова class. Экземплярные методы можно вызывать только через переменную-объект класса. Классовые же методы не связаны с конкретным экземпляром класса; их следует вызывать в виде:

 

<имя класса>.<имя метода>(параметры)

 

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

 

16. Свойства:

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

 

property <имя>: <тип> read <имя функции чтения> write <имя процедуры записи>;

 

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

 

function <имя функции чтения>: тип;
procedure <имя процедуры записи>(<параметр>: <тип>);

 

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

Свойства не могут передаваться по ссылке в процедуры и функции.

 

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

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

Type

<имя класса1>=class

<описание полей >

function <имя метода1>(<параметры>);

Begin

<тело метода>

end;

end;

<имя класса2>=class(<имя класса1>)

<описание полей >

function <имя метода1>(<параметры>);

Begin

<тело метода>

end;

procedure <имя метода2>(<параметры>);

Begin

<тело метода>

end;

end;

 

Перед словом class может быть указано ключевое слово final – в этом случае от класса запрещено наследовать.

 

 

18. Переопределение методов:

Метод базового класса может быть переопределен (замещен) в подклассах. Если при этом требуется вызвать метод базового класса, то используется служебное слово inherited.

Type

<имя класса1>=class

<описание полей >

procedure <имя метода1>(<параметры>);

Begin

<тело метода>

end;

end;

<имя класса2>=class(<имя класса1>)

<описание полей >

procedure <имя метода1>(<параметры>);

inherited <имя метода1>

Begin

<тело метода>

end;

end;

Если метод в потомке имеет то же название, что и в базовом классе (с теми же параметрами) и не используя слово inherited, то метод в потомке замещается.

 

19. Наследование конструкторов:

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

 

 

21. Виртуальные методы и полиморфизм:

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

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

Для того чтобы сделать метод виртуальным, следует в объявлении этого метода после заголовка указать ключевое слово virtual с последующей;. Для переопределения виртуального метода следует использовать ключевое слово override

Type

<имя класса1>=class

<описание полей >

procedure <имя метода1>;virtual;

Begin

<тело метода>

end;

end;

<имя класса2>=class(<имя класса1>)

<описание полей >

procedure <имя метода1>;override;

Begin

<тело метода>

end;

end;

Виртуальные методы связаны в виртуальную цепочку. Чтобы виртуальную цепочку разорвать используется слово reintroduce.

Type

<имя класса3>=class(<имя класса2>)

<описание полей >

procedure <имя метода1>;virtual;reintroduce;

Begin

<тело метода>

end;

end;

end;

 

20. Перегрузка операций:

Перегрузка операций - это средство языка, позволяющее вводить операции над типами, определяемыми пользователем. В PascalABC.NET можно использовать только предопределенные значки операций. Перегрузка операций для типа T, являющегося классом или записью, осуществляется при помощи статической (классовой) функции-метода со специальным именем operator ЗнакОперации. Перегрузка специальных операций +=, -=, *=, /= осуществляется с помощью статической (классовой) процедуры-метода, первый параметр которой передается по ссылке. Пример:

Type

<имя класса>=class

re,im:real;

class function operator+ (a,b:<имя класса>):<имя класса>

Begin

result.re:=a.re+b.re;

result.im:=a.im+b.im

end;

end;

Для перегрузки операций действуют следующие правила:

1. Перегружать можно все операции за исключением @ (взятие адреса), as, is, new. Кроме того, можно перегружать специальные бинарные операции +=, -=, *=, /=, не возвращающие значений.

2. Перегружать можно только еще не перегруженные операции.

3. Тип по крайней мере одного операнда должен совпадать с типом класса или записи, внутри которого определена операция.

4. Перегрузка осуществляется с помощью статической функции-метода, количество параметров которой совпадает с количеством параметров соответствующей операции (2 - для бинарной, 1 - для унарной).

5. Перегрузка операций +=, -=, *=, /= осуществляется с помощью статической процедуры-метода, первый параметр которой передается по ссылке и имеет тип записи или класса, в котором определяется данная операция, второй - передается по значению и совместим по присваиванию с первым. Перегрузка остальных операций осуществляется с помощью статических функций-методов, параметры которых должны передаваться по значению.

6. Типы интерфейсов не могут быть типами параметров. Причина: типы параметров должны вычисляться на этапе компиляции.

7. Операции приведения типа задаются статическими функциями, у которых вместо имени используется operator implicit (для неявного приведения типа) или operator explicit (для явного приведения типа).

 

22. Абстрактные методы:

Методы, предназначенные для переопределения в подклассах, объявляются с ключевым словом abstract и называются абстрактными. Данные методы являются виртуальными, но ключевое слово virtua l использовать не нужно.

Type

<имя класса1>=class

<описание полей >

procedure <имя метода1>;abstract;

end;

Классы, содержащие абстрактные методы, также называются абстрактными. Экземпляры этих классов создавать нельзя. Классы с абстрактными методами используются как "полуфабрикаты" для создания других классов. Использование override при переопределении абстрактных методов обязательно, поскольку абстрактные методы являются разновидностью виртуальных.

Type

<имя класса2>=class(<имя класса1>)

<описание полей >

procedure <имя метода1>;override;

Begin

<тело метода>

end;

end;

 

 



Поделиться:




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

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


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