为什么接口不包含其成员的任何实现?还有其他原因只能宣布成员除了能够将其作为一种合同使用吗?
问题不在于什么是接口或为什么我们需要接口。问题是为什么我们的设计只包含声明。我不认为有很多类似的问题。我找不到相关的ans,所以提出了一个新的帖子。
答案 0 :(得分:3)
首先,接口成员不能包含实现的断言并不完全正确:尽管您无法在接口本身中编写实现,但您可以通过将接口放在接口的扩展方法中来共享接口“外部成员”的实现。 LINQ库从为接口提供方法实现的能力中获得了很大的力量,而不一定是用于类。
通常,接口提供了一种机制,通过定义完成的内容而将合同与其实现分离,而不指定 如何完成。这种分离非常强大,因为它允许您共享编程到接口的代码。例如,您可以编写代码仅过滤一次集合,然后对多种类型的集合重用相同的代码。
答案 1 :(得分:2)
接口有两个目的:
考虑这个样本:
public class X : IMustSerialize
{ }
此类实现无成员接口IMustSerialize
。在遍历所有类或实例时,您可以检查该类是否实现此接口并相应地执行操作。
答案 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
{
}
相反,不允许接口拥有主体,然后接口成为一种安全机制,允许对象具有类似于多重继承的多态性,而不会出现与完全多重继承相关的任何问题。