在Java中使用抽象类时的编码样式

时间:2012-12-12 17:21:22

标签: java abstract-class

在未实现所有方法的场景中继承基类时,最好将空方法放在基类中,以便不需要该方法的子类可以完全忽略它,而其他方法如果要实现它,类必须覆盖该方法...例如:

基类:

public void myMethod() {
}

未实施的子类:

<nothing!>

或者更好的做法是让基类更清晰,只需将抽象方法放入其中并强制子类在没有实现该方法的情况下充实空白方法?

基类:

public abstract void myMethod();

未实施的子类:

public void myMethod() {
}

7 个答案:

答案 0 :(得分:1)

这是你的设计决定。如果您想强制开发人员覆盖myMethod并开发逻辑。你应该去抽象课。

答案 1 :(得分:1)

编码风格取决于您,取决于您的要求,一切都有自己的优点和缺点。

在抽象类的情况下,没有必要只放入抽象方法。我建议你,最好使用Interface。

答案 2 :(得分:1)

两者都不是最优雅的解决方案,尽管两者都可以完成工作。使用设计模式策略设计模式http://www.newthinktank.com/2012/08/strategy-design-pattern-tutorial/

答案 3 :(得分:1)

这取决于你,这取决于具体情况。

当你有一个抽象类时,你可以使用抽象方法,并且你想要扩展它的类来实现该方法(因为抽象父类使用抽象方法 - 它可能类似于print())。它类似于接口的方法,但它通常用于不同的场景。但在大多数情况下我会使用界面 ......

我只会在myMethod()在扩展抽象父类的每个类中做不同的事情时使用抽象方法...否则,如果myMethod()通常做同样的事情和一两个类需要覆盖它,我将使用第一个解决方案。

另请参阅模板方法模式。我不知道你的案件是哪个,所以我不能准确地回答这个问题......

答案 4 :(得分:1)

只要有可能,你应该

首选接口到抽象类

因为接口不允许包含方法实现,所以有 所谓的Abstract * Interface *,它是两种技术的组合: 在这种情况下,接口定义类型,而抽象类提供骨架实现 一个例子是Collection Framework,它提供了骨架实现:AbstractCollection, AbstractList, AbstractSet and AbstractMap.

进一步了解Josh Bloch,Effective Java 2nd Edition,Item 18

答案 5 :(得分:1)

我认为这取决于myMethod()是否有一个有意义的默认实现。如果存在,则将其放在基类中,如果子类需要不同的东西,则只覆盖它们。

如果没有有意义的默认值,并且实际上每个非抽象子类应该实现方法本身或从中间类继承实现,那么在基类中提供虚假实现是一个非常糟糕的主意。它将编译器可能检测到的错误转换为只能通过测试找到的错误。

在某些情况下需要考虑的一个选项是提供抛出UnsupportedOperationException的默认实现。

答案 6 :(得分:0)

抽象类的区别在于你可以但不能覆盖该函数。

因此可以覆盖public void nothing() {},并且必须覆盖public abstract void nothing2();