【问题标题】:Partial implementation of an abstract method?抽象方法的部分实现?
【发布时间】:2016-05-16 21:22:24
【问题描述】:

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

我怎样才能实现这样的目标:

void method(){
    everybodyDoesThisStuff;

    // more individual stuff 

    // more individual stuff
}

抽象方法不能有主体,如果你不把它抽象化,你就会重写该方法并丢失它。

【问题讨论】:

  • 除了将everyoneDoesThisStuff 提取到您从method() 的每个覆盖器显式调用的方法中之外,没有任何真正好的方法可以做到这一点。
  • 制作individualStuff()moreIndividualStuff() 抽象方法并从method() 调用它们。
  • @LouisWasserman 是的,这就是我目前正在做的事情,我只是想知道上面的事情是否可行。这样我就不必在 100 个不同的类中调用该方法。
  • 您可以覆盖它,并且仍然可以 super.method() 从派生类中的父类访问该方法。
  • @MitchWeaver 真的吗?确切地?如果你忘记调用 super 怎么办?答案中有很多更好的方法。

标签: java methods abstract


【解决方案1】:

您应该将执行“更个性化”的方法抽象化,而不是方法本身。

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

【讨论】:

  • 如果在每次调用method 时确实完成everybodyDoesThisStuff() 很重要,那么您甚至可以使method final
【解决方案2】:

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

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

protected abstract void doMethod();

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

【讨论】:

【解决方案3】:

你可以让普通方法调用抽象方法:

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

【讨论】:

    【解决方案4】:

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

    为什么不将everybodyDoesThisStuff 提取到一个单独的方法中并将其放入Interface 中?

    【讨论】:

    • 你能举个例子吗?
    猜你喜欢
    • 2016-11-08
    • 2017-10-28
    • 1970-01-01
    • 1970-01-01
    • 2013-05-30
    • 2021-10-17
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    相关资源
    最近更新 更多