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

11. Инкапсуляция при помощи свойств

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

С точки зрения пользователя класса свойство этого класса выглядит как поле – его значение можно считывать и записывать. Например,

Edit1.Text:=Button1.Caption;

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

1) Можно напрямую отобразить свойство на внутренние поля класса.

2) Можно назначить методы, которые должны использоваться для осуществления, чтения, и записи значений свойства. Если свойства отражены на методы, то в рамках этих методов может выполняться целый комплекс действий, связанных с доступом к значению свойства.

Например:

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

Технически свойства – это идентификатор, который отображается на данные или методы при помощи специальных ключевых слов read и write , например.

Введем в класс Tdate свойство Month/

Есть специальное ключевое свойство PROPERTY

Property month:integer read Fmonth

Write SetMonth

Для чтения используется частное поле Fmonth, а для изменения его значения метод SetMonth. Этот метод должен быть определен внутри класса. Влзможна любая другая комбинация.

Например, метод можно использовать и для чтения и для записи.

Или наоборот читать при помощи метода а записывать при помощи поля.

Property Month: integer read GetMonth write SetMonth;

Property Month:integer read GetMonth write FMonth;

Использование метода для модификации значений свойства является общепринятой практикой.

Обычно связанные со свойством данные и методы являются частными PRIVATE или защищенными PROTECTED, а само свойство является общедоступным.(обычная практика ООП). Т..е. любой доступ к этим данным и методам осуществляется только с использованием свойств.

Инкапсуляция при помощи свойств является как упрощенной, так и расширенной.

+ Расширенной она является потому, что можно менять не только внутренне представление данных и функций доступа, но и добавлять новые функции доступа, не меняя при этом кода, который обращается к классу.

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

Механизм завершения класса (ctrl shift C) может автоматически сформировать заготовки методов доступа к внутренним данным класса для любого из определенных свойств.

12. Свойства-массивы

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

1. После имени массива свойств необходимо определить список индексных параметров.

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

2. Спецификации методов чтения и записи (если определены) должны ссылаться только на метод доступа.

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

4. На массив свойств нельзя ссылаться как на единое целое.

Свойства­-массивы – это индексированные свойства. Они могут представлять такие сущности, как элементы списков, управляющие элементы, принадлежащие некоторому родительскому, пикселы изображения и т.д.

Объявление свойства-массива включает список параметров, который определяет имена и типы индексов, например:

property Objects[Index: Integer]: TObject read GetObject write SetObject;

property Pixels[X, Y: Integer]: TColor read GetPixel write SetPixel;

property Values[const Name: string]: string read GetValue write SetValue;

Для свойств-массивов спецификаторы доступа должны быть методами, а не полями. Метод в спецификаторе read должен быть функцией, число, порядок и тип параметров которой должны точно соответствовать списку индексов свойства. Возвращаемое функцией значение должно иметь, разумеется, тип свойства.

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

Пример:

1 модуль

TZoo = class

private

Z: TList;

protected

function GetAnimal (Index: integer): TAnimal;

procedure SetAnimal (Index: integer; Value: TAnimal);

public

property Zoo[Index: integer]: TAnimal read GetAnimal write SetAnimal; default;

procedure DeleteAnimal (Index: integer);

constructor Create;

destructor Destroy; override;

end;

2 модуль

TForm1 = class(TForm)

var

Form1: TForm1;

MyZoo: TZoo;

Animal: Tanimal;

procedure TForm1.Button1Click(Sender: TObject);

begin

MyZoo.Zoo[i] := Animal;

inc(i);

procedure TForm1.Button3Click(Sender: TObject);

begin

MyZoo.DeleteAnimal(StrToInt(Edit1.Text));

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]