为什么接口不能包含实现?
本文关键字:实现 包含 不能 接口 为什么 | 更新日期: 2023-09-27 18:06:02
为什么接口不包含其成员的任何实现?除了能够将其用作一种契约之外,它只声明成员还有其他原因吗?
问题不在于什么是Interface或者我们为什么需要Interface。问题是为什么我们的设计只包含宣言。我不认为有很多类似的问题。
首先,接口成员不能包含实现的断言并不完全正确:尽管您不能在接口本身中编写实现,但您可以通过将其放置在接口的扩展方法中来共享接口"外部成员"的实现。LINQ库的很大一部分功能来自于为接口提供方法实现的能力,而不是为类提供方法实现的能力。
一般来说,接口通过定义做什么而不指定如何做来提供一种将契约与其实现分离的机制。这种分离非常强大,因为它允许您共享对接口编程的代码。例如,您可以编写代码只过滤一次集合,然后对多种类型的集合重用相同的代码。在。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
{
}
通过不允许接口具有主体,接口成为一种安全机制,允许对象具有类似于多重继承的多态性,而不会出现与完全多重继承相关的任何问题。
接口有两个用途:
- 正如你已经说过的:用于建立一个对象的使用合同;
- 接口也可以用作标记。它不需要成员。
考虑以下示例:
public class X : IMustSerialize
{ }
该类实现了无成员接口IMustSerialize
。当遍历所有类或实例时,您可以检查类是否实现了该接口并采取相应的行动。