2013-08-30 3 views
0

У меня есть интерфейс под названием ISupport, который используется для предоставления технической поддержки.Как узнать, что конкретный объект класса уже находится в TInterfaceList?

ISupport = Interface(IInterface) 
    procedure AddReport(const Report: TStrings); 
End; 

Каждый класс, который имеет соответствующую информацию для поддержки реализует этот интерфейс, и в конструкторе звонки:

procedure TySupport.RegisterSupport(Support: ISupport); 
begin 
    if FInterfaceList.IndexOf(Support) = -1 then 
    FInterfaceList.Add(Support); 
end; 

Пример использования (частичное):

TyConfig = class(TInterfacedObject, ISupport) 
private 
    procedure AddReport(const Report: TStrings); 

public 
    constructor Create; 
end; 

constructor TyConfig.Create; 
begin 
    if Assigned(ySupport) then 
    ySupport.RegisterSupport(Self); 
end; 

Позднее код Я могу перечислить список и просто позвоню в AddReport.

Моя проблема заключается в том, что существует один класс, этот TyConfig, который создается многократно, и информация, которую он будет сообщать, точно такая же. FInterfaceList.IndexOf позволяет избежать добавления одного и того же интерфейса.

Я хочу, чтобы ISupport от TyConfig регистрировался более одного раза.

+2

[Как передать интерфейс объекту в Delphi] (http://stackoverflow.com/q/4138211/1699210) – bummi

ответ

2

Начиная с Delphi 2010 можно отливать из интерфейса к объекту:

var 
    obj: TObject; 
    intf: IInterface; 
.... 
obj := intf as IInterface; 

После того, как у вас есть эта возможность, это небольшой шаг, чтобы проверить, что объект является производным от определенного класса:

if obj is TyConfig then 
    .... 

С этими изделиями вы сможете решить вашу проблему.

+0

До D2010 вы можете сделать то же самое, что интерфейс RTL 'IInterfaceComponentReference' делает для' TComponent'. Создайте другой интерфейс, скажем, 'ITyConfigReference', единственной целью которого является вернуть указатель' Self' объекта TyConfig', а затем «TyConfig» реализовать 'ITyConfigReference', а также' ISupport'. Таким образом, вы можете запросить любой интерфейс 'ISupport' для' ITyConfigReference', и если он поддерживается, используйте его, чтобы получить указатель на объект «TyConfig», если это необходимо. Или просто тот факт, что поддерживается «ITyConfigReference», достаточно, чтобы узнать, является ли объект «TyConfig» или нет. –

Смежные вопросы