Делегирование полномочий интерфейсов, свойство классов типа интерфейс


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

Синтаксис объявления свойства в классе реализации с делегированными полномочиями:

Property <имя свойства>: <имя класса\имя интерфейса>
[Read <имя поля>] [Write <имя поля>]
[Implements <Interfacel,.., InterfaceN>];
Type
TNewClass=CIass(TObject, IMylntl)
FMylntf: IMylntf;
Property Mylntf: IMylntf Read FMylntf Write FMylntf Implements IMylntf; End;

В классе объявляется свойство Mylntf, реализующее интерфейс IMylntf.

Примечания:
• Команда Implements должна быть последней командой в объявлении
свойства и может включать несколько интерфейсов, разделяемых запятыми.
• Свойство с командой Implements должно иметь тип интерфейса или класса.
• Свойство с командой Implements не может быть свойством-массивом и не может использоваться команда Index.
• Должен быть раздел Read. При этом, если указывается метод в разделе Read, то он должен использовать заданное по умолчанию соглашение о вызовах register. Этот метод не может быть динамическим или определяться с директивой Message. Однако он может быть виртуальным.
• Команда Implements может использоваться для наследованных свойств, добавляя список интерфейсов.
• В подобных случаях класс не является интерфейсным классом, т.е. классом, в котором объявляются и реализуются методы интерфейса.
• Достоинство этой команды заключается также и в том, что она позволяет отложить использование необходимых для реализации интерфейсов ресурсов до того момента, пока они не потребуются реально. Особенно тогда, когда они используются очень редко.

Свойства классов типа интерфейс
Если делегируемое свойство имеет тип интерфейс, то следует учитывать следующие особенности таких классов:
• Этот интерфейс, или интерфейс, из которого он получен, должен бытьуказан в списке предков класса, в котором свойство объявлено.
• Делегируемое свойство должно возвратить объект, чей класс полностью реализует интерфейс, определенный командой Implements, и который делает это без использования принципа разрешающей способности метода.

Туре
IMyIntf=Interface // Объявляем интерфейс
Function F1: String; Function F2: String;
End;
// Объявляем класс, реализующий интерфейс
TMyImplClass=Class(TInterfacedObject, IMylntf)
Function F1: String;
Function F2: String;
End;
// Объявляем класс с делегируемым свойством типа интерфейса
TMyClass=Class(TObject, IMylntf)
FMylntf: IMylntf; // Объявляем поле типа интерфейса
Property Mylntf: IMylntf Read FMylntf // Объявляем свойство
Write FMylntf Implements IMylntf;
End;
Var MyObj: TMyClass; // Объявляем ссылку-объект
Intf: IMylntf; // Объявляем интерфейсную ссылку
Function TMyImplClass.F1: String; // Реализация метода F1
Begin
Result:=' функция Fl1'; End;
Function TMyImplClass.F2: String; // Реализация метода F2
Begin
ResuIt:=' функция F1';
End;
Procedure TForml.ButtonlClick(Sender: TObject);
Begin
MyObj :=TMyClass.Create; // Инициализация объекта
//Присваиваем свойству объект класса, реализующего интерфейс
MyObj.MyIntf:=TMyImplCIass.Create;
Теперь можно:
A:= MyObj.MyIntf.F1

То есть мы можем вызывать функции, реализованные в другом классе, через свойство.


Комментарии запрещены.




Статистика