- •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. События стандартных визуальных компонент и их использование
24. Ссылки на класс
Ссылки на класс – это элемент языка, позволяющий в процессе выполнения программы манипулировать не экземплярами классов, а самими классами. Т.е. ссылка на класс – это не класс, не объект, не ссылка на объект, а ссылка на тип данных класса. Тип данных ссылка на класс (СНК) определяет тип переменной – СНК. Предположим, что определен класс TMyClass. Определим новый тип данных СНК: type TMyClassRef = class of TMyClass. Теперь можно определить переменные обоих классов: var AClassRef: TMyClassRef; AnObject: TMyClass. Пример ипользования. Begin … AClassRef:= TMyClass; AnObject:= TMyClass.Create; … end Ссылки на класс позволяют оперировать типами данных в процессе выполнения программы. Возможно использование ссылки на класс в любом выражении, в котором это допустимо. Таких выражений не много, но некоторый случаи представляют особый инетерес. Простейший случай – создание объекта: AClassRef:= TMyClass AnObject:= AClassRef.Create Здесь конструктор применен к ссылке на класс вместо настоящего класса, т.е. ссылка на класс используется для создания объекта этого класса. Типы СНК не были бы такими полезными, если бы они не удовлетворяли такому же правилу совместимости типов, которое применимо к классам. Т.е. если в программе объявлена ссылка на класс, то можно как соответствующий конкретный класс, так и любой из его потомков. Например: AClassRef:= TMyNewClass В библиотеке времени выполнения и библиотеке визуальных компонентов Delphi: TClass = class of Object; ExceptClass = class of Exception; TComponentClass = class of TComponent; TControlClass = class of TControl; TFormClass = class of TForm. В частности, тип СНК TClass может хранить ссылку на любой класс, потому что любой класс является производным от TObject. Ссылка TFormClass используется в исходном коде большинства процессов в Delphi. Метод CreateForm объекта Application требует в качестве параметра класс формы, которую нужно создать: Application.CreateForm(TForm1,Form1). Ссылку на класс можно применить к методам связанного с ней класса. Т.к. каждый класс наследуется от TObject, любую ссылку на класс можно применить к его методам.
25. Создание компонентов при помощи ссылок на класс
Практическая польза механизмов ссылок на класс в Делфи даёт возможность своевременно оперировать типами данных в процессе выполнения программы и это является фундаментальной составляющей среды Delphi. При добавлении нового компонента на форму, мы выбираем его из палитры компонентов. На самом деле, мы выбираем тип данных и создаём объект этого типа данных. Это происходит скрыто от нас. Другими словами, механизм ссылок на классы обеспечивает полиморфизм в процессе конструирования объектов.
Пример:
Форма имеет 3 переключатели, при выборе одного из них и щелчке на форме создается компонент соответствующего класса. Имя такое же как и в Дельфи происходит.
Форма должна иметь поле типа ссылка на класс.
Private
Class: TControlClass;
Counter:integer;
При щелчке на каждом из переключателей поле в ClassRef сохраняется соответсующий тип данных.
Procedure TFrom1.RadioButtonBtnClick(sender);
Begin
ClassRef:=TButton;
End;
Каждый раз при щелчке поле пересохранается, обработчики события onClick других переключателей аналогичны. Кроме того, поле classRef необходимо инициализировать при обработке события onClick формы.
Обработаем событие onMouseDown, нам понадобятся X и Y.
Procedure TFrom1.FormMouseDown( x y);
Var newCtrl:TControl; myName:string;
Begin
newCtrl:=ClassRef.Create(self);
newCtrl.Visible:=False;
newCtrl.Parent:=Self;
newCtrl.hight=x; newCtrl.Top:=Y;
inc(Counter);
myName:=ClassRef.ClassName+IntToStr(Counter);
Delete(myName,1,1);
End;
//используем вместо типа данных ссылку на класс. Используем ссылку на класс вместо …TObject.
Тут есть элемент полиморфизма. Чтобы сработал механизм полиморфного конструирования, базовый тип класса, на который ссылается переменная типа ссылка на класс, должен обладать виртуальным конструктором.
Если базовый класс обладает виртуальным конструктором, то при обращении конструктору ссылки на класс будет выполнен метод, являющийся конструктором того класса, на который в данный момент ссылается ссылка на класс. Если же конструктор базового типа не виртуальный, то при обращении к конструктору ссылки на класс будет вызван конструктор фиксированного типа, указанного при объявлении переменной.
