Java和C#语言存在很多偏差,其中一个我观察到的是我们无法在接口中添加变量常量。来自Java背景,当我尝试这个时,我感到困惑,看到编译错误。
有没有人解释为什么会这样?
答案 0 :(得分:13)
字段是类的实现细节,不应公开其接口。 接口是一种抽象出类的实现细节的方法。这两个概念看起来很矛盾,并没有真正融合在一起。
你可以在接口中声明属性。
UPDATE(在意识到问题是关于常量,而不是变量字段之后): 我认为(纯粹是我的个人推测),Java决定允许这样的构造因为它当时没有enum
类型。 C#从一开始就有枚举,并且大多数时候首选的是常量。此外,您可以在C#中创建一个静态类,并在其中添加您喜欢的所有内容并将其沿着界面发送,而不会有任何麻烦。支持这样的构造只会使接口定义更复杂。
答案 1 :(得分:3)
我很少想在界面中有一个实际的常量 - 它们通常在类中更有意义。使用Java接口只包含常量(为了减少使用它们的类中的键入)的做法是令人讨厌的;我只将常量放在接口中,它们与接口本身的功能有关。
然而,有时我认为能够在界面中定义枚举会很好,如果这是唯一预期使用枚举的上下文。有趣的是,即使C#没有,VB也允许这样做。
实际上,这两种方法都可以将界面本身转变为“迷你命名空间”。但是,我不能说我在编写C#时经常错过它。正如C#团队喜欢说的那样,功能不会被删除 - 它们已经添加,并且添加功能的成本非常高。这意味着该功能确实需要减轻其重量 - 在添加功能之前必须有一个显着的好处。我个人不会把这一点放在名单上。
相关的想法:能够在接口中定义嵌套的类可能会很好,通常是接口的实现 - 表达其合同或充当“默认”实现对于有这种事情的情况。
答案 2 :(得分:0)
并且在Java中也不鼓励向接口添加常量(至少根据Effective Java)
答案 3 :(得分:-1)
向接口添加常量是错误的,几乎不可能完成。在过去,许多人使用许多常量声明接口,然后使另一个类实现此接口,以便他们可以使用常量而不限定所述常量。这当然是另一种反模式,只是因为人们懒惰而完成。如果你真的想在接口中使用常量,那么定义一个返回该常量的方法。