区分Abstract类和接口类是否很重要?
抽象类只是一个接口类,有一些具体的方法。
如果抽象类与Interface类共享相同的前缀“I”,我们可以通过引入新的逻辑等轻松地将我们的接口类升级为抽象类。
更新
我之所以这样问,界面在项目增长时会产生一些限制。 例如,
如果一个接口已经由千个类“实现”,并且在某些时候我们需要在基类中引入一些新方法,我们将不得不修复所有子类。
抽象类在功能扩展方面提供了灵活性,因为它可以提供默认实现而不会影响子类。
这就是为什么我能够交换使用接口和抽象类的想法。
ICar car = new Merz(); // ICar can be interface or abstract class
但是,当我再次考虑它时,我们仍然需要更改所有子类,因为类声明迫使我们在一开始就使用“extends”或“implements”。
所以我认为在抽象/接口类上没有做多态的选择。
答案 0 :(得分:13)
“I”前缀实际上不是Java方式。那就是C#。
对于Java,我通常使用这个约定:
我认为这与Java标准(分别是Map,AbstractMap,HashMap)非常吻合。
至于用抽象类替换接口,这需要一个重构器。我认为对所有方法返回,数据成员类型,局部变量类型和参数使用接口更好。抽象类是(或应该是)实现细节。
回到Map示例,这意味着一切都是Map。您可以创建自己的Map子类。 JDK为您提供了一个辅助类,它可以完成大部分样板工作。如果你根据抽象类声明成员,你将被迫使用它,这不是最好的结果。
答案 1 :(得分:6)
不,你不能轻易做到这一点,因为你也可能继承自另一个类,而Java不允许从类中继承多个。
最好有一个标准的命名结构。在Java中,我不确定您是否需要采用I
前缀;我认为这是able
后缀。无论哪种方式,采用一种,并使其保持一致。
- 编辑
对于抽象类,我的首选是Base
后缀,但是对于每个后缀:)
答案 2 :(得分:1)
抽象类与某个特定事物上的接口非常不同。
给定的类可以实现任意数量的接口,但只能扩展一个抽象类。
因此,应该区别对待它们,而不是命名术语。为界面选择一个简短的描述性名称 - 您将再次看到它很多。例如,List是一个接口,但ArrayList是类。
答案 3 :(得分:1)
我正在与Java合作,我和我的同事正在使用
抽象类实现了最常用的接口方法或最常用的util方法。
您不必从Abstract类扩展。如果实现的方法对您要生成的类有用,则应该从Abstract类扩展。
否则你应该实现接口并再次实现这些方法。
您只从1个类扩展,因此如果您只使用50%的方法,则从Abstract类扩展时不会出现这种情况。
答案 4 :(得分:1)
Java中的接口以'able'结尾。对于Ex:Cloneable,Serialisable。因此,如果可能,您可以选择以“able”结尾的名称。实现接口的抽象类应以名称“abstract”开头。例如:abstractLinkedList。具体类别不受任何此类命名约定的约束,除了它们应该有意义并以大写字母开头。我建议你选择以'able'结尾的接口名称,或者你可以为我添加前缀(最后的手段,不推荐用于java,但是使用MS语言中的默认命名约定,如c#)来区分你的接口和类实现
答案 5 :(得分:1)
@ janetSmith, 那么你可以坚持使用汽车作为接口名称和CarImpl作为实现汽车接口的类。唯一的问题是粗略地看一下'Car'并没有表明它是一个接口还是一个类,除非你看一下CarImpl。如果需要,您可以坚持使用“I”为接口名称添加前缀。这是一个微不足道的违规行为。 Java实践表明。你可以查看here 当实现它的类表现出行为时,接口名称应该能够结束。例如:如果汽车的子类提供了诸如move,park等行为。您可以使用移动,停放等接口名称。这适用于没有后缀'able'的动词的接口名称。
- 编辑:我的观点是ICar。