Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Конструирование программ.doc
Скачиваний:
12
Добавлен:
05.05.2019
Размер:
12.37 Mб
Скачать

4.2.5 Операции с объектами

Для объектов определены следующие операции: = , <>, is, as.

Операции = , <> – это операции отношения для объектов одного класса.

4.2.5.1 Оператор is

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

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

Пример:

if Sender is TEdit then

TEdit(Sender).Text := 'Пример оператора is';

В этом примере, если объект Sender принадлежит классу TEdit, тогда можно использовать свойство объекта Text.

4.2.5.2 Оператор as

Оператор as выполняет контролируемое преобразование типа объекта к указанному классу.

Выражение <объект> as <класс> возвращает тот же самый объект, приведенный к указанному классу. Если преобразование невозможно, то формируется ошибка.

Пример:

(Sender as TButton).Caption := 'Ok'

4.2.5.3 Копирование объектов одного класса

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

  • Создать объекты. Например, МуObject1, МуObject2

  • Копировать данные объекта МуObject1 в объект МуObject2:

МуObject2.Assign(МуObject1);

Для копирования нельзя использовать оператор присваивания, так как в этом случае происходит присваивание указателей!

Например, оператор МуObject2 := МуObject1; присваивается значение указателя МуObject1 указателю МуObject2!

4.2.6 Свойства

Доступ к данным класса должен осуществляться только методами класса. Этот принцип объектно-ориентированной разработки программ, называемый инкапсуляцией, в языке Object Pascal реализован с помощью свойств (property).

Свойства определяют доступ к полям класса через методы класса, делая сами поля недоступными. Для стандартных классов Delphi это выполняется на 100%.

Синтаксис описания свойства:

property <имя свойства> = <тип> read <имя поля или метода чтения>

write <имя поля или метода чтения>

default <значение по умолчанию>

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

type

TSomeObject = class(TObject)

function GetColor: TSomeType;

procedure SetColor(NewValue: TSomeType);

property SomeColor: TSomeType read GetColor write SetColor;

end;

В данном примере доступ к значению свойства SomeColor осуществляется через вызовы методов GetColor и SetColor.

Однако в обращении к этим методам в явном виде нет необходимости: достаточно написать, например: AnObject. SomeColor := SomeValue;

SomeVariable := AnObject. SomeColor; и компилятор самостоятельно оттранслирует обращение к свойству SomeColor в вызовы методов GetColor или SetColor.

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

Если в описании свойства отсутствует write – значит свойство доступно только для чтения! Аналогично можно сконструировать свойство только для записи.

Пример векторного свойства:

type

TRectangle = class

private

FCoordinates: array[0..3] of Longint;

function GetCoordinate(Index: Integer): Longint;

procedure SetCoordinate(Index: Integer; Value: Longint);

public

property Left: Longint index 0 read GetCoordinate write SetCoordinate;

property Top: Longint index 1 read GetCoordinate write SetCoordinate;

property Right: Longint index 2 read GetCoordinate write SetCoordinate;

property Bottom: Longint index 3 read GetCoordinate write SetCoordinate;

property Coordinates[Index: Integer]: Longint read GetCoordinate

write SetCoordinate;

end;