一尘不染

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

c#

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


阅读 762

收藏
2020-05-19

共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方法。但是
领域不是方法 。没有与该字段关联的“插槽”,然后您可以通过引用该字段位置来“填写”。因此,接口可以定义方法,属性,索引器和事件,但不能定义字段。

2020-05-19