小编典典

为什么 C# 接口不能包含字段?

all

例如,假设我想要一个ICar接口并且所有实现都将包含字段Year。这是否意味着每个实现都必须单独声明Year?在界面中简单地定义它不是更好吗?


阅读 200

收藏
2022-05-18

共1个答案

小编典典

尽管许多其他答案在语义级别上是正确的,但我发现从实现细节级别处理这类问题也很有趣。

接口可以被认为是 的集合,其中包含 方法 。当一个类实现一个接口时,该类需要告诉运行时如何填充所有需要的槽。当你说

interface IFoo { void M(); } 
class Foo : IFoo { public void M() { ... } }

该类说“当你创建我的实例时,在 IFoo.M 的插槽中填充对 Foo.M 的引用。

然后当你打电话时:

IFoo ifoo = new Foo();
ifoo.M();

编译器生成的代码显示“询问对象 IFoo.M 的插槽中有什么方法,然后调用该方法。

如果接口是包含方法的槽的集合,那么其中一些槽还可以包含属性的 get 和 set 方法、索引器的 get 和 set 方法以及事件的 add 和
remove 方法。但是 字段不是方法
。没有与字段关联的“插槽”,您可以使用对字段位置的引用来“填写”该字段。因此,接口可以定义方法、属性、索引器和事件,但不能定义字段。

2022-05-18