使用继承的接口作为 TDictionary 中的键
继承的接口可以用作 TDictionary 中的键吗?
//! Note the inheritance of the interfaces
ILoggingProvider = interface
procedure Log(AMessage : string);
end;
IHTTPLoggingProvider = interface(ILoggingProvider)
function Login(AUserName : string; APassword : string) : boolean
end;
ILiveLoggingProvider = interface(ILoggingProvider)
function ConnectMonitor : boolean
end;
var
loggers : TDictionary<ILoggingProvider,TObject>;
...
loggers.add(ILoggingProvider, TSomeLogger.Create());
loggers.add(IHTTPLoggingProvider , TSuperLogger.Create()); //fails!
loggers.add(ILiveLoggingProvider , TAnotherLogger.Create()); //fails!
... //and the use them selectively
if loggers.ContainsKey(IHTTPLoggingProvider ) then
loggers.Items[IHTTPLoggingProvider].Log('Good bye world!');
... //and like this
var
theLogger : IHTTPLoggingProvider;
if loggers.ContainsKey(IHTTPLoggingProvider ) then
begin
theLogger := IHTTPLoggingProvider(loggers.Items[IHTTPLoggingProvider]);
if theLogger.Login('billy', 'bones') then
theLogger.Log('some message');
end;
Can an inherited Interface be used as a key in TDictionary?
//! Note the inheritance of the interfaces
ILoggingProvider = interface
procedure Log(AMessage : string);
end;
IHTTPLoggingProvider = interface(ILoggingProvider)
function Login(AUserName : string; APassword : string) : boolean
end;
ILiveLoggingProvider = interface(ILoggingProvider)
function ConnectMonitor : boolean
end;
var
loggers : TDictionary<ILoggingProvider,TObject>;
...
loggers.add(ILoggingProvider, TSomeLogger.Create());
loggers.add(IHTTPLoggingProvider , TSuperLogger.Create()); //fails!
loggers.add(ILiveLoggingProvider , TAnotherLogger.Create()); //fails!
... //and the use them selectively
if loggers.ContainsKey(IHTTPLoggingProvider ) then
loggers.Items[IHTTPLoggingProvider].Log('Good bye world!');
... //and like this
var
theLogger : IHTTPLoggingProvider;
if loggers.ContainsKey(IHTTPLoggingProvider ) then
begin
theLogger := IHTTPLoggingProvider(loggers.Items[IHTTPLoggingProvider]);
if theLogger.Login('billy', 'bones') then
theLogger.Log('some message');
end;
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
根据我的评论,我认为这是可以实现的:
Following on from my comment, here is how I think this could be implemented: