【问题标题】:An interface that "extends itself" is ensuring what?“自我扩展”的界面确保了什么?
【发布时间】:2020-09-16 00:44:18
【问题描述】:

我正在关注 EventBus 的教程并遇到以下界面:

public interface IEventHandler<in TEvent> : IEventHandler where TEvent : Event
{
    Task Handle(TEvent @event);
}

public interface IEventHandler
{

}

现在,我得到了泛型部分和限制,但我错过了接口扩展自身的点。 这是我第一次看到它被这样使用。它完成什么? 任何人都可以对这个主题有所了解吗?谢谢!

【问题讨论】:

  • 是什么让您认为接口实现了自己?泛型接口扩展了非泛型接口。如果您希望某些代码能够处理 any 事件处理程序,而其他代码只能处理 特定 事件处理程序,这将很有用。
  • 接口自己实现是根本不可能的。如何在声明接口的同时实现未声明的自身?
  • 是的。我现在明白了@JonSkeet
  • 它们是同名的接口,但由泛型类型参数区分(因此,它们是不同的)。另请注意,您不能在 Java、Kotlin 或 TypeScript 等语言中执行此操作,因为 GTP 在编译时会被删除。由于 GTP 在运行时对 CLR 可见,因此 IEventHandler&lt;T&gt;IEventHandler 可以相互区分。 (注意 TypeScript(上图)以斜体显示,因为您可以实现类似的功能,如下所示:interface IEventHandler&lt;T = any&gt; { ... }

标签: c# generics .net-core interface restriction


【解决方案1】:

在 C# 中,InterfaceInterface&lt;T&gt; 类型(您有时会将其视为 Interface`1)是不同的类型。它们在类型系统内部没有任何关系(除非一个接口扩展了另一个接口)。

当您来自 Java 背景时,这可能会让人感到困惑,因为您有“原始类型”并且 List&lt;T&gt; 始终同时是 List。这不适用于 C#。

您可以重命名接口以使这种区别更清晰:

IEventHandler<in TEvent> : IEventHandlerRaw

(这只是为了让解释更清楚,不建议在生产代码中使用)

【讨论】:

  • 我怀疑用后缀Generic 命名一个通用接口是不好的风格。所以在真正的代码中做这件事可能不是一件好事。
  • @omajid:当然,我只是想指出AA&lt;T&gt; 是不同的类型,你也可以将它们命名为AB&lt;T&gt;。不过,我已经编辑了我的答案
猜你喜欢
  • 2018-03-26
  • 1970-01-01
  • 2018-08-02
  • 1970-01-01
  • 1970-01-01
  • 2014-01-15
  • 2015-05-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多