2016-05-16 102 views
0

例如,我有很多类都需要一定的方法。 在这种方法中,所有这些类需要一行代码,该方法的其余部分是不同的。抽象方法的部分实现?

我怎么能做到这样的事情:

void method(){ 
    everybodyDoesThisStuff; 

    // more individual stuff 

    // more individual stuff 
} 

抽象方法不能有身体,如​​果你不让它抽象那么您需要覆盖的方法,并失去它。

+0

没有任何真正的好方法可以做到这一点,除了把每个人都抛弃到一个你明确从每个'method()'的覆盖中调用的方法。 –

+0

生成'individualStuff()'和'moreIndividualStuff()'抽象方法,并从method()调用它们。 – aioobe

+0

@LouisWasserman是的,这就是我现在正在做的,我只是想知道是否有可能像上面这样的东西。这样我就不必在100个不同的类中调用该方法。 –

回答

12

你应该让“更多个人的东西”抽象的方法,而不是方法本身。

// 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 
    } 
} 
+3

如果每个'EveryoneDoesThisStuff()确实每次调用'方法'时都可以使'方法'最终成为'方法'。 – aioobe

+0

@aioobe谢谢,只是补充说! – forrert

+1

这被称为[模板方法模式](http://www.oodesign.com/template-method-pattern.html)。 – Andreas

3

可以进行正常的方法调用一个抽象方法:

void foo(){ 
    // do stuff 
    bar(); // let the abstract method do the rest 
} 
abstract void bar(); 
5

一种解决方案是要求所有子类调用super.method()。问题是没有办法实际执行。另一种选择是创建一个内部执行所需的线独立的方法,然后调用一个抽象方法:

public final void method() { 
    callEveryTime(); 
    doMethod(); 
} 

protected abstract void doMethod(); 

注意method()public final,因此它可以在任何地方,但不叫覆盖,而doMethod()protected因此它可以被覆盖,但不在其包(或子类)之外调用。

+0

这被称为[Template Method pattern](http://www.oodesign.com/template-method-pattern.html)。 – Andreas

0

如果您问自己是否需要抽象方法的部分实现,通常需要重新考虑设计的粒度。

为什么不提取everybodyDoesThisStuff到一个单独的方法,并把它放在Interface

+0

这也是一个不错的选择。 –

+0

你可以发表一个例子吗? – shmosel