例如,我有很多类都需要一定的方法。 在这种方法中,所有这些类需要一行代码,该方法的其余部分是不同的。抽象方法的部分实现?
我怎么能做到这样的事情:
void method(){
everybodyDoesThisStuff;
// more individual stuff
// more individual stuff
}
抽象方法不能有身体,如果你不让它抽象那么您需要覆盖的方法,并失去它。
例如,我有很多类都需要一定的方法。 在这种方法中,所有这些类需要一行代码,该方法的其余部分是不同的。抽象方法的部分实现?
我怎么能做到这样的事情:
void method(){
everybodyDoesThisStuff;
// more individual stuff
// more individual stuff
}
抽象方法不能有身体,如果你不让它抽象那么您需要覆盖的方法,并失去它。
你应该让“更多个人的东西”抽象的方法,而不是方法本身。
// 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
}
}
可以进行正常的方法调用一个抽象方法:
void foo(){
// do stuff
bar(); // let the abstract method do the rest
}
abstract void bar();
一种解决方案是要求所有子类调用super.method()
。问题是没有办法实际执行。另一种选择是创建一个内部执行所需的线独立的方法,然后调用一个抽象方法:
public final void method() {
callEveryTime();
doMethod();
}
protected abstract void doMethod();
注意method()
是public final
,因此它可以在任何地方,但不叫覆盖,而doMethod()
是protected
因此它可以被覆盖,但不在其包(或子类)之外调用。
这被称为[Template Method pattern](http://www.oodesign.com/template-method-pattern.html)。 – Andreas
如果您问自己是否需要抽象方法的部分实现,通常需要重新考虑设计的粒度。
为什么不提取everybodyDoesThisStuff
到一个单独的方法,并把它放在Interface
?
这也是一个不错的选择。 –
你可以发表一个例子吗? – shmosel
没有任何真正的好方法可以做到这一点,除了把每个人都抛弃到一个你明确从每个'method()'的覆盖中调用的方法。 –
生成'individualStuff()'和'moreIndividualStuff()'抽象方法,并从method()调用它们。 – aioobe
@LouisWasserman是的,这就是我现在正在做的,我只是想知道是否有可能像上面这样的东西。这样我就不必在100个不同的类中调用该方法。 –