为什么接口不能包含实现?

时间:2014-06-01 10:38:37

标签: c# .net

为什么接口不包含其成员的任何实现?还有其他原因只能宣布成员除了能够将其作为一种合同使用吗?

问题不在于什么是接口或为什么我们需要接口。问题是为什么我们的设计只包含声明。我不认为有很多类似的问题。我找不到相关的ans,所以提出了一个新的帖子。

3 个答案:

答案 0 :(得分:3)

首先,接口成员不能包含实现的断言并不完全正确:尽管您无法在接口本身中编写实现,但您可以通过将接口放在接口的扩展方法中来共享接口“外部成员”的实现。 LINQ库从为接口提供方法实现的能力中获得了很大的力量,而不一定是用于类。

通常,接口提供了一种机制,通过定义完成的内容而将合同与其实现分离,而不指定 如何完成。这种分离非常强大,因为它允许您共享编程到接口的代码。例如,您可以编写代码仅过滤一次集合,然后对多种类型的集合重用相同的代码。

答案 1 :(得分:2)

接口有两个目的:

  • 正如你已经说过的那样:建立一个使用对象的合同;
  • 接口也可以用作标记。它不需要成员。

考虑这个样本:

public class X : IMustSerialize
{ }

此类实现无成员接口IMustSerialize。在遍历所有类或实例时,您可以检查该类是否实现此接口并相应地执行操作。

另见What is the purpose of a marker interface?

答案 2 :(得分:2)

在.NET的设计中很早就决定不允许多重继承。

如果他们允许,那么这将是合法的:

class A
{
    void Blah() { /* body */ }
}

class B
{
    void Blah() { /* body */ }
}

class C : A, B
{
}

问题是Blah应该归类C继承。

如果接口有实现,这个问题基本相同。它会变成这样:

class IA
{
    void Blah() { /* body */ }
}

class IB
{
    void Blah() { /* body */ }
}

class C : IA, IB
{
}

相反,不允许接口拥有主体,然后接口成为一种安全机制,允许对象具有类似于多重继承的多态性,而不会出现与完全多重继承相关的任何问题。