- •1. Новые концепции ооп в языке Oblect Pascal
- •2. Объектно-ориентированный подход в программировании
- •Основные понятия
- •3. Понятие класса и объекта
- •4. Поля, методы и свойства объекта
- •5. Ключевое слово Self, примеры использования
- •6. Перегруженные методы
- •7. Создание и удаление объектов
- •8. Инкапсуляция
- •9. Инкапсуляция и модули
- •10. Директивы видимости
- •11. Инкапсуляция при помощи свойств
- •12. Свойства-массивы
- •13. Индексированные свойства
- •14. Свойства и иерархия классов
- •15. Конструкторы, перегрузка конструкторов, 16. Деструкторы
- •17. Ссылочная модель объектов Delphi
- •18. Наследование
- •19. Совместимость типов
- •20. Полиморфизм и позднее связывание
- •21. Виртуальные, динамические методы
- •22. Абстрактные методы
- •23. Бе6зопасное преобразование типов
- •24. Ссылки на класс
- •25. Создание компонентов при помощи ссылок на класс
- •26. Интерфейсы
- •27. Технические приемы, связанные с использованием интерфейсов (делегирование, использование директивы implements)
- •28. Исключительные ситуации
- •29. Порядок выполнения программы и блок finally
- •30. Классы исключений
- •31. Исключения и отладка приложений
- •32. Класс tObject, использование методов класса Tobject
- •33. Понятие события
- •34. Обработчики событий. Делегирование в Delphi
- •35. События стандартных визуальных компонент и их использование
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));
