部分实现抽象方法?

时间:2016-05-16 21:22:24

标签: java methods abstract

例如,我有很多类都需要某种方法。 在这个方法中,所有这些类都需要一行代码,方法的其余部分是不同的。

我怎么能达到这样的目的:

void method(){
    everybodyDoesThisStuff;

    // more individual stuff 

    // more individual stuff
}

抽象方法不能有一个正文,如果你不把它作为抽象,你就会覆盖该方法而失去它。

4 个答案:

答案 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