2

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

基类:

public void myMethod() {
}

未实现的子类:

<nothing!>

还是让基类更干净,只放入一个抽象方法并强制子类充实一个空白方法,如果它没有实现该方法?

基类:

public abstract void myMethod();

未实现的子类:

public void myMethod() {
}
4

7 回答 7

1

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

于 2012-12-12T17:25:20.207 回答
1

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

在抽象类的情况下,不必只放置抽象方法。我会推荐你​​,最好使用接口。

于 2012-12-12T17:25:22.377 回答
1

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

于 2012-12-12T17:26:51.300 回答
1

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

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

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

另请查看模板方法模式。我不知道你的情况是什么,所以我无法准确回答这个问题......

于 2012-12-12T17:27:52.180 回答
1

只要有可能,你应该

更喜欢接口而不是抽象类

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

更多信息参见 Josh Bloch,Effective Java 2nd Edition,Item 18

于 2012-12-12T17:40:28.563 回答
1

我认为这归结为 myMethod() 是否存在有意义的默认实现。如果有,请将其放在基类中,子类仅在需要不同的东西时才覆盖。

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

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

于 2012-12-12T17:47:50.093 回答
0

抽象类的不同之处在于您可以但不能覆盖该函数。

所以public void nothing() {}可以被覆盖并且public abstract void nothing2();必须被覆盖。

于 2012-12-12T17:23:46.120 回答