当一个接口“继承”另一个接口时,你该如何称呼它?

44
如果我有以下代码: ``` class B : A {} ``` 我会说"类B继承自类A"或者"类B派生自类A"。
然而,如果代码如下:
  class B : ISomeInterface   {}

说“B继承ISomeInterface”是错误的——正确的术语是说“B 实现 ISomeInterface”。

但是,假设我有以下代码:

  interface ISomeInterface : ISomeOtherInterface   {}

现在,仍然不应该说“继承”,但由于ISomeInterface没有实现任何内容而说“实现”也同样错误。

那么,你如何称呼这种关系呢?


2
随便选一个:http://thesaurus.reference.com/search?q=extend 我个人比较喜欢“ISomeInterface aggrandizes ISomeOtherInterface” :-) - nickf
现在可以有效地执行您所要求的操作:interface ISomeInterface : ISomeOtherInterface了吗?如果是这样,在最新的C#语言规范中是否已经“实现”(如果是,从哪个版本开始)?我想知道我是否仍然被困在时间漩涡中... - joedotnot
6个回答

60

我个人会用 "extends" 这个词,我记得 C# 规范里也有用到过(可惜我现在找不到了) - 不过我记得 Eric Lippert 曾表示他对这个词并不很喜欢,并且想在 4.0 版本中将其更改。

我认为这样做是好的,因为它表明你正在扩展原始接口指定的合同。

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

规范在第 13.2 节中解释了这个问题。它讨论了成员从基本接口继承的情况。它谈到了一个类扩展另一个类,但没有提及接口。

编辑:在 C# 5 规范的第 13.1.4 节中,它使用了 "inherits" 这个词:

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

因此,这可能是最好的术语。


1
实现(Implements)意味着为接口定义一个实现。接口没有实现,因此在这里不可能。但是一个接口可以扩展另一个接口,这意味着它可以添加更多的方法并继承其类型。对于扩展(Extends),点赞(+1)。 - Ben Doerr
VB.Net使用'Inherits'关键字。在描述相同的C#代码时,使用'Inherits'可能是合适的。 - Bryan Rayner
3
我找到了使用"inherits"的C# 5规范中的相关部分。 - Jon Skeet
一如既往地,我询问后不到一分钟就得到了完整的回复。 - John Demetriou
1
@binki:我想我们只能同意不同意。在我看来,这似乎是一个合理的单词使用,并且显然也是规范使用的单词。 - Jon Skeet
显示剩余3条评论

7
通常我称之为过度工程化。

3
INewerVersion扩展了IOlderVersion接口。COldClass实现了IOlderVersion接口,但没有实现INewerVersion接口。CNewClass实现了INewerVersion接口。在哪里存在过度设计并不明显。 - Windows programmer
2
@Windows程序员:这是一个很好的例外。因此,通常会过度设计。首先,这有点玩笑。其次,当您拥有从接口继承的接口时,您至少有三个继承级别,因为有人也将实现这些接口。那就开始变得复杂了。 - dsimcha
所以,如果我们试图编写符合“接口隔离原则”的“SOLID”代码,而不必让每个既能读又能写的流实现两个单独的接口,那么IStream是否应该扩展IReadableStream和IWriteableStream的组合?或者这是“过度工程”吗?有时候我会觉得一个好的编程项目就像一次成功的飞机着陆-你可以从中获益。 - Shavais

7
我称之为“扩展”。

6
作为一个权威的信息来源,如果您需要有用的引用,我找到了一些MSDN上的信息,描述了ComboBox、Control、Listbox和TextBox的接口继承结构,并提供了实际示例:https://www.microsoft.com/en-us/download/details.aspx?id=55979 并且在明确基础接口中提到了:

一个接口可以从零个或多个接口继承,这些接口被称为接口的显式基接口

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

Source:

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


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

1

你的定义是错误的。

B:A 的意思是“B 继承自 A”。

当我们说“B 实现了 InterfaceA”时,通常意味着 InterfaceA 没有函数的定义 - 它只有原型(或者在 C++ 中是纯虚函数)。然而,在 C++ 和大多数面向对象编程语言中,继承和实现共享相同的语法。

因此,InterfaceB:InterfaceA 仍然意味着“InterfaceB 继承自 InterfaceA”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接