例如,我有很多类都需要某种方法。 在这个方法中,所有这些类都需要一行代码,方法的其余部分是不同的。
我怎么能达到这样的目的:
void method(){
everybodyDoesThisStuff;
// more individual stuff
// more individual stuff
}
抽象方法不能有一个正文,如果你不把它作为抽象,你就会覆盖该方法而失去它。
答案 0 :(得分:13)
你应该使用“更多个别东西”抽象的方法,而不是方法本身。
// AbstractBase.java
public abstract class AbstractBase {
public final void method() {
everybodyDoesThisStuff();
doIndividualStuff();
}
abstract void doIndividualStuff();
private void everybodyDoesThisStuff() {
// stuff that everybody does
}
}
// ConcreteClass.java
public class ConcreteClass extends AbstractBase {
void doIndividualStuff() {
// do my individual stuff
}
}
答案 1 :(得分:5)
一种解决方案是要求所有子类调用super.method()
。问题是没有办法实际执行。另一种选择是创建一个单独的方法,在内部执行所需的行,然后调用抽象方法:
public final void method() {
callEveryTime();
doMethod();
}
protected abstract void doMethod();
请注意,method()
为public final
,因此可以在任何地方调用但不会被覆盖,而doMethod()
为protected
,因此可以覆盖它,但不会在其包外调用(或子类)。
答案 2 :(得分:3)
您可以将常规方法调用为抽象方法:
void foo(){
// do stuff
bar(); // let the abstract method do the rest
}
abstract void bar();
答案 3 :(得分:0)
如果您问自己是否需要部分实施抽象方法,通常需要时间重新考虑设计的粒度。
为什么不将everybodyDoesThisStuff
提取到单独的方法中并将其放入Interface
?