代码之家  ›  专栏  ›  技术社区  ›  janetsmith

我们需要根据命名约定区分接口类和抽象类吗?

  •  2
  • janetsmith  · 技术社区  · 15 年前

    区分抽象类和接口类很重要吗?

    抽象类只是一个接口类,有一些具体的方法。

    如果抽象类与接口类共享相同的前缀“i”,则可以通过引入新的逻辑等方法轻松地将接口类升级为抽象类。

    更新

    我问这个问题的原因是,当项目增长时,接口会施加一些限制。 例如,

    如果一个接口已经被上千个类“实现”,并且在某个时候我们需要在基类中引入一些新方法,那么我们将不得不修复所有的子类。

    抽象类在功能扩展方面提供了灵活性,因为它可以在不影响子类的情况下提供默认实现。

    这就是为什么我想到了交互使用接口和抽象类。

    ICar car = new Merz(); // ICar can be interface or abstract class
    

    然而,当我再次考虑这个问题时,我们仍然需要更改所有的子类,因为类声明迫使我们在一开始就使用“extends”或“implements”。

    所以我认为在抽象/接口类上做多态性是没有选择的。

    6 回复  |  直到 15 年前
        1
  •  13
  •   cletus    15 年前

    “i”前缀并不是真正的java方式。更多的是C。

    对于Java,我通常使用以下约定:

    • 接口: 建设者
    • 抽象类: 抽象生成器
    • 混凝土等级: builderImpl、DefaultBuilder、MyBuilder等

    我认为这与java标准(分别是map、abstractmap和hashmap)非常吻合。

    至于用抽象类替换接口,则需要重构。我认为最好对所有方法返回、数据成员类型、局部变量类型和参数使用接口。抽象类是(或应该是)实现细节。

    回到地图的例子,这意味着一切都是地图。您可以创建自己的映射子类。jdk为您提供了一个helper类,它可以完成大多数样板文件。如果你用抽象类来声明成员,你将被迫使用它,这不是最好的结果。

        2
  •  6
  •   Noon Silk    15 年前

    不,您不能这么简单,因为您可能还从另一个类继承,而且Java不允许从类进行多重继承。

    最好有一个标准的命名结构。在Java中,我不确定您是否需要采用 I 前缀;我想是 able 后缀。不管怎样,采纳一个,并保持一致。

    --编辑

    对于抽象类,我更喜欢 Base 后缀,但每个人都有自己的后缀:)

        3
  •  1
  •   Thorbjørn Ravn Andersen    15 年前

    抽象类与特定事物上的接口非常不同。

    给定的类可以实现任意数量的接口,但只能扩展一个抽象类。

    因此,应该区别对待它们,但不应以命名方式对待它们。为接口选择一个简短的描述性名称-您将再次看到它。例如,instance list是一个接口,而arraylist是一个类。

        4
  •  1
  •   Markus Lausberg    15 年前

    我和我的同事们正在使用java的洞日

    • 接口:IDialog
    • 摘要:摘要对话框
    • 类:默认对话框,警告对话框

    抽象类实现了最常见的接口方法或最常用的util方法。

    您不必从抽象类进行扩展。如果实现的方法对要生成的类有用,则应该从抽象类扩展。

    否则,您应该实现接口并再次实现方法。

    您只从一个类扩展,所以如果您只能使用50%的方法,那么当您从抽象类扩展时,它不会有任何意义。

        5
  •  1
  •   Cshah    15 年前

    Java中的接口以“able”结尾。例如:可克隆,可序列化。因此,如果可能,您可以选择以“able”结尾的名称。实现接口的抽象类应以名称“abstract”开头。例如:AbstractLinkedList。具体类不受任何此类命名约定的约束,除非它们应该有意义并以大写字母开头。我建议您选择以“able”结尾的接口名称,或者您可以在i前面加上前缀(最后一种方法,不建议用于java,而是使用c_等ms语言中的默认命名约定),以便将接口与类实现区分开来

        6
  •  1
  •   Cshah    15 年前

    @珍妮茨米特, 你可以坚持使用cletus-answer来使用car作为接口名,使用carimpl作为实现car接口的类。唯一的问题是,粗略地看一下“car”并不能说明它是一个接口还是一个类,除非你也看一下carimpl。如果你想要,你可以用“I”来坚持前缀界面名称。这是一个微不足道的违规行为。Java实践表明了这一点。你可以去看看 here 当实现它的类表现出这种行为时,接口名称应该以ABLE结尾。例如:如果CAR提供的行为的子类如MOVE、PARK等,则可以有MOVEABLE、PARKABLE等接口名称。这适用于不带后缀“able”的动词接口名称。

    --编辑:我的意见是支持icar。