【问题标题】:What do you call it when one interface "inherits" from another?当一个接口从另一个接口“继承”时,你怎么称呼它?
【发布时间】:2010-10-22 21:00:15
【问题描述】:

如果我有 B 类:A {}

我说“B 类继承 A 类”或“B 类派生自A 类”。

但是,如果我有:

  class B : ISomeInterface   {}

说“B 继承了 ISomeInterface”是错误的——正确的说法是说“B implements ISomeInterface”。

但是,假设我有

  interface ISomeInterface : ISomeOtherInterface   {}

现在,说“继承”仍然是错误的,但现在说“实现”同样错误,因为 ISomeInterface 没有实现任何东西。

那么,你怎么称呼这种关系?

【问题讨论】:

  • 任你选择:thesaurus.reference.com/search?q=extend 我个人喜欢“ISomeInterface 强化 ISomeOtherInterface”:-)
  • 所以现在可以按照您的要求进行操作:interface ISomeInterface : ISomeOtherInterface ?如果您原谅双关语,这是在最新的 C# 语言规范中“实施”了吗(如果是,从哪个版本开始?)想知道我是否仍然陷入时间扭曲......

标签: c# oop interface


【解决方案1】:

作为权威来源,如果您需要有用的引用,我遇到了info on MSDN,它描述了“接口继承”,并附有接口继承的实际示例ComboBox、Control、Listbox 和 TextBox 的结构:

并提到显式的基本接口

一个接口可以从零个或多个接口继承,它们是 称为接口的显式基接口

例子:

interface IControl
{
   void Paint();
}
interface ITextBox: IControl
{
   void SetText(string text);
}
interface IListBox: IControl
{
   void SetItems(string[] items);
}
interface IComboBox: ITextBox, IListBox {}

来源:

http://msdn.microsoft.com/en-us/library/aa664578%28VS.71%29.aspx

【讨论】:

    【解决方案2】:

    我个人说“扩展”并且我认为 C# 规范在某个地方也使用了这个词(不幸的是,我现在找不到它) - 但我记得 Eric Lippert 说他不是热衷于它,并想将其更改为 4.0。

    我觉得很好,因为它表明你正在扩展原始接口指定的合同。

    编辑:查看了 3.0 规范...

    规范部分回避了第 13.2 节中的问题。它讨论了从基本接口继承的成员。它谈论一个扩展另一个,而不是接口

    编辑:在 C# 5 规范第 13.1.4 节中,它使用继承:

    一个接口可以从零个或多个接口类型继承

    所以这可能是最好的用语。

    【讨论】:

    • 实现意味着定义接口的实现。接口没有实现,所以这里不可能。但是一个接口可以扩展另一个接口,这意味着它可以添加更多方法并继承其类型。 +1 扩展
    • VB.Net 使用“继承”关键字。在 C# 中描述相同的代码时,使用“继承”可能是合适的。
    • @BryanRayner:现在也找到了使用继承的 C# 5 规范的适当位。
    • 一如既往地询问,一分钟后得到完整答复
    • @binki:我认为我们必须同意不同意。在我看来,这个词的使用是合理的,而且它显然 规范使用的词。
    【解决方案3】:

    通常,我称之为过度工程。

    【讨论】:

    • INewerVersion 扩展了 IolderVersion。 COldClass 实现 IolderVersion 但不实现 INewerVersion。 CNewClass 实现 INewerVersion。过度工程在哪里?
    • @Windows 程序员:这是一个很好的例外。因此,通常过度工程。首先,这有点开玩笑。其次,当你有从接口继承的接口时,你至少有三个层次的继承,因为有人也会实现这些接口。这开始上升了。
    • 因此,如果我们尝试编写向“接口隔离原则”致敬的“SOLID”代码,而不让每个可以读写的流都实现两个单独的接口,IStream 是否应该扩展IReadableStream 和 IWriteableStream 的组合?还是那是“过度工程”?有时我发现自己认为一个好的编程项目就像一次好的飞机着陆 - 你离开它。
    【解决方案4】:

    为什么说 InterfaceB“继承”或“派生自”InterfaceA 是错误的? “实现”是错误的,因为 InterfaceB 不提供实现。从语义上讲,派生接口与派生类非常相似。 例如,C++ 根本不区分接口和类。

    【讨论】:

      【解决方案5】:

      你的定义是错误的。

      B : A 表示“B 继承自 A”。

      当我们说“B 实现 InterfaceA”时,这通常意味着 InterfaceA 没有定义功能 - 它只是原型(或者,C++ 中的 PURE)。但是在 C++ 和大多数 OOPL 中,继承和实现共享相同的语法。

      所以,InterfaceB : InterfaceA 仍然意味着“InterfaceB 继承 InterfaceA”。

      【讨论】:

        【解决方案6】:

        我称之为“扩展”。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2012-05-12
          • 2010-12-13
          • 2010-09-06
          • 2018-07-07
          • 1970-01-01
          • 1970-01-01
          • 2013-10-22
          相关资源
          最近更新 更多