Class Base{
public void doThings(){
//some logic that needed by subclass
}
}
Class A extends Base{
public void doThings(){
super.doThings();
doOtherThings();
}
}
我想要的是强制A覆盖doThings()方法(如果没有则会出现错误信息)并调用super.doThings();但是Base中的doThings()不应该是抽象的,因为它有正文。
有没有合适的解决方案?我在下面的链接中找到了相同的问题,但接受的答案没有正确回答。 Force SubClasses to @Override method from SuperClass. Method in SuperClass must have body
答案 0 :(得分:5)
如果你想确保调用基类的doThings,你应该像这样设计你的类:
abstract class Base {
public void doThings() {
// do some things here
...
// make sure subclass does some things too
methodYouMustImplement();
}
abstract void methodYouMustImplement();
}
class A extends Base {
@Override void methodYouMustImplement() {
// do some other things
}
}
这样,A被迫提供了methodYouMustImplement()的实现,并且设计保证调用doThings()中的代码而不需要记住来调用super.doThings( )。 然后你可以考虑将doThings()作为最终结果,正如Andy Turner所说的那样。
答案 1 :(得分:2)
调用super方法的要求是considered an anti-pattern;除此之外,强制子类实现方法的唯一方法是将其抽象化。
如果您希望首先调用super.doThings()
,然后再调用子类特定的东西,请解决问题:
doThings()
最终abstract
内调用的doThings()
方法。这样的事情:
abstract class Base {
public final void doThings() {
methodYouMustImplement();
// Stuff after subclass-specific implementation.
}
abstract void methodYouMustImplement();
}
class A extends Base {
@Override void methodYouMustImplement() {
doOtherThings();
}
}
doThings()
为final
这一事实对于需求非常重要:这可以保证在调用doThings()
时您希望发生的事情,因为没有子类可以更改此方法。如果您将其保留为非final,则子类可以决定覆盖doThings()
,这意味着methodYouMustImplement()
(以及您在doThing()
中指定的任何其他操作)不一定被调用。
答案 2 :(得分:2)
我认为使用如下的构造会更容易:
public class Base {
public void doStuff() {
doSpecificStuff();
// do base stuff every one has to do
}
abstract void doSpecificStuff();
}
public class WeirdlySpecific extends Base {
public void doSpecificStuff() {
// specific stuff happens
}
}
这不会强制WeirdlySpecific
实际实现doStuff()
方法,但只要doStuff()
被任何调用方调用为契约,每个更具体的实现都有自己的版本事件