【发布时间】:2011-12-07 20:44:18
【问题描述】:
继承的接口可以用作 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;
【问题讨论】:
-
当然
TDictionary<ILoggingProvider,TObject>想要接口引用而不是接口。TObject到IHTTPLoggingProvider的演员阵容非常可疑。值类型应该是一个接口。我认为我会将密钥设为 GUID。还是我拿错了棍子的一端? -
@David:正确 - 使用接口也可以工作,并且在使用纯接口方法时更加一致 - 好主意。当我声明
TLoggers = TDictionary<TGUID,ILoggingProvider>时,它会在构造“TLoggers”实例时引发异常Invalid type cast,而loggers := TDictionary<TGUID,ILoggingProvider>.Create很好。有什么想法吗? -
我的答案中的代码编译、运行和操作正确。
标签: delphi generics dictionary delphi-xe