如何找出如果對象支持IHandle < T>和有任何可能的解決方法在德爾福(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;
更新
我想通過馬爾科姆·格羅夫斯link
點出優秀的文章「通用接口德爾福」,它描述我想實現什麼。
注意[QualityCentral現在已經關閉(https://community.embarcadero.com/blogs/entry/quality-keeps-moving-forward) ,所以你不能訪問'qc.embarcadero.com'鏈接了。如果您需要訪問舊的QC數據,請查看[QCScraper](http://www.uweraabe.de/Blog/2017/06/09/how-to-save-qualitycentral/)。 – 2017-06-09 17:21:01