使用继承的接口作为 TDictionary 中的键

发布于 2024-12-09 21:17:35 字数 1086 浏览 5 评论 0原文

继承的接口可以用作 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

蔚蓝源自深海 2024-12-16 21:17:35

根据我的评论,我认为这是可以实现的:

type
  ILoggingProvider = interface
    ['{30598F45-1230-4208-B1A5-E1D2DA8F6D40}']
    procedure Log(AMessage : string);
  end;

  IHTTPLoggingProvider = interface(ILoggingProvider)
    ['{CFA01514-AC44-4E30-971B-115986B37D26}']
    function Login(AUserName : string; APassword : string) : boolean;
  end;

  ILiveLoggingProvider = interface(ILoggingProvider)
    ['{6EA68BEF-8D78-4FDF-AACD-1D164A272758}']
    function ConnectMonitor : boolean;
  end;

  TLoggingProvider = class(TInterfacedObject, ILoggingProvider)
    procedure Log(AMessage : string);
  end;

  THTTPLoggingProvider = class(TInterfacedObject, ILoggingProvider, IHTTPLoggingProvider)
    procedure Log(AMessage : string);
    function Login(AUserName : string; APassword : string) : boolean;
  end;

  TLiveLoggingProvider = class(TInterfacedObject, ILoggingProvider, ILiveLoggingProvider)
    procedure Log(AMessage : string);
    function ConnectMonitor : boolean;
  end;

procedure Main;
var
  loggers : TDictionary<TGUID,ILoggingProvider>;
  theLogger : IHTTPLoggingProvider;
begin
  loggers := TDictionary<TGUID,ILoggingProvider>.Create;
  try
    loggers.add(ILoggingProvider, TLoggingProvider.Create);
    loggers.add(IHTTPLoggingProvider, THTTPLoggingProvider.Create);
    loggers.add(ILiveLoggingProvider, TLiveLoggingProvider.Create);

    if loggers.ContainsKey(IHTTPLoggingProvider) then
      loggers.Items[IHTTPLoggingProvider].Log('Good bye world!');

    if loggers.ContainsKey(IHTTPLoggingProvider) then
    begin
      theLogger := loggers.Items[IHTTPLoggingProvider] as IHTTPLoggingProvider;
      if theLogger.Login('billy', 'bones') then
        theLogger.Log('some message');
    end;
  finally
    loggers.Free;
  end;
end;

Following on from my comment, here is how I think this could be implemented:

type
  ILoggingProvider = interface
    ['{30598F45-1230-4208-B1A5-E1D2DA8F6D40}']
    procedure Log(AMessage : string);
  end;

  IHTTPLoggingProvider = interface(ILoggingProvider)
    ['{CFA01514-AC44-4E30-971B-115986B37D26}']
    function Login(AUserName : string; APassword : string) : boolean;
  end;

  ILiveLoggingProvider = interface(ILoggingProvider)
    ['{6EA68BEF-8D78-4FDF-AACD-1D164A272758}']
    function ConnectMonitor : boolean;
  end;

  TLoggingProvider = class(TInterfacedObject, ILoggingProvider)
    procedure Log(AMessage : string);
  end;

  THTTPLoggingProvider = class(TInterfacedObject, ILoggingProvider, IHTTPLoggingProvider)
    procedure Log(AMessage : string);
    function Login(AUserName : string; APassword : string) : boolean;
  end;

  TLiveLoggingProvider = class(TInterfacedObject, ILoggingProvider, ILiveLoggingProvider)
    procedure Log(AMessage : string);
    function ConnectMonitor : boolean;
  end;

procedure Main;
var
  loggers : TDictionary<TGUID,ILoggingProvider>;
  theLogger : IHTTPLoggingProvider;
begin
  loggers := TDictionary<TGUID,ILoggingProvider>.Create;
  try
    loggers.add(ILoggingProvider, TLoggingProvider.Create);
    loggers.add(IHTTPLoggingProvider, THTTPLoggingProvider.Create);
    loggers.add(ILiveLoggingProvider, TLiveLoggingProvider.Create);

    if loggers.ContainsKey(IHTTPLoggingProvider) then
      loggers.Items[IHTTPLoggingProvider].Log('Good bye world!');

    if loggers.ContainsKey(IHTTPLoggingProvider) then
    begin
      theLogger := loggers.Items[IHTTPLoggingProvider] as IHTTPLoggingProvider;
      if theLogger.Login('billy', 'bones') then
        theLogger.Log('some message');
    end;
  finally
    loggers.Free;
  end;
end;
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文