C#接口中不允许使用的字段

Java和C#语言存在很多偏差,其中一个我观察到的是我们无法在接口中添加变量常量。 来自Java背景,当我尝试这个时,我感到困惑,看到编译错误。

有没有人解释为什么会这样?

字段是类的实现细节 ,不应公开其接口。 接口是一种抽象出类的实现细节的方法。 这两个概念看起来很矛盾,并没有真正融合在一起。

可以在接口中声明属性。


更新(在意识到问题是关于常量而不是变量字段之后):认为 (纯粹是我的个人推测)Java决定允许这样的构造,因为它当时没有enum类型。 C#从一开始就有枚举,并且大多数时候都喜欢常量。 此外,您可以在C#中创建一个静态类,并在其中添加您喜欢的所有内容并将其沿着界面发送,而不会有任何麻烦。 支持这样的构造只会使接口定义更复杂。

我很少想在界面中有一个实际的常量 – 它们通常在类中更有意义。 使用Java接口包含常量(为了减少使用它们的类中的类型)的做法是令人讨厌的; 我只将常量放在接口中,它们与接口本身的function有关。

但是,有时我认为能够在界面中定义枚举会很好,如果这是预期使用枚举的唯一上下文。 有趣的是,即使C#没有,VB也允许这样做。

实际上,这两种方法都可以将界面本身转变为“迷你命名空间”。 但是,我不能说我在编写C#时经常错过它。 正如C#团队喜欢说的那样,function不会被删除 – 它们会被添加 ,并且添加function的成本非常高。 这意味着该function确实需要减轻其重量 – 在添加function之前必须有一个显着的好处。 我个人不会把这个问题列入清单。


相关的想法:能够在接口中定义嵌套可能会很好,通常是接口的实现 – 要么表达它的合同,要么作为存在这种事情的情况下的“默认”实现。

并且在Java中也不鼓励向接口添加常量(至少根据Effective Java)

向接口添加常量是错误的,几乎不可能完成。 在过去,许多人使用许多常量声明了Interfaces,然后使另一个类实现了这个接口,这样他们就可以使用常量而无需限定所述常量。 这当然是另一种反模式,只是因为人们懒惰而完成。 如果你真的想在接口中使用常量,那么定义一个返回该常量的方法。