【发布时间】:2010-09-08 05:44:25
【问题描述】:
如何确定对象是否支持 IHandleT> 以及在 delphi(2010,XE)中是否有任何可能的解决方法来实现这一点?还有没有人看到一个很好的 delphi 事件聚合器实现?
IHandle<TMessage> = interface
procedure Handle(AMessage: TMessage);
end;
EventAggregator = class
private
FSubscribers: TList<TObject>;
public
constructor Create;
destructor Destroy; override;
procedure Subscribe(AInstance: TObject);
procedure Unsubscribe(AInstance: TObject);
procedure Publish<T>(AMessage: T);
end;
procedure EventAggregator.Publish<T>(AMessage: T);
var
LReference: TObject;
LTarget: IHandle<T>;
begin
for LReference in FSubscribers do
begin
LTarget:= LReference as IHandle<T>; // <-- Wish this would work
if Assigned(LTarget) then
LTarget.Handle(AMessage);
end;
end;
procedure EventAggregator.Subscribe(AInstance: TObject);
begin
FSubscribers.Add(AInstance);
end;
procedure EventAggregator.Unsubscribe(AInstance: TObject);
begin
FSubscribers.Remove(AInstance)
end;
更新
我想指出 Malcolm Groves link 的优秀文章“Delphi 中的通用接口”
它准确地描述了我想要实现的目标。
【问题讨论】: