如何确保从子类(Java)中的方法在抽象超类中调用某些方法

时间:2015-08-09 13:28:44

标签: java inheritance

我有一个方法doSomething()的抽象超类A. A的子类必须实现doSomething(),但每次子类调用doSomething()时都应该调用一些公共代码。我知道这可以实现:

public class A {
  public void doSomething() {
    // Things that every sub-class should do 
  }
}

public class B extends A {
  public void doSomething() {
    super.doSomething();
    // Doing class-B-specific stuff here
    ...
  }
}

但这似乎有三个问题:

  • 方法签名必须匹配,但我可能只希望在子类方法中返回一些内容,而不是在超类中返回
  • 如果我使A.doSomething()抽象,我不能在A中提供(常见)实现。如果我不使它抽象,我不能强迫子类实现它。
  • 如果我使用不同的方法来提供常用功能,我无法强制B.doSomething()调用该常用方法。

有关如何实施这些方法的任何想法?

3 个答案:

答案 0 :(得分:6)

以下情况如何?

public abstract class A {
  protected abstract void __doSomething();

  public void doSomething() {
    // Things that every sub-class should do 
    __doSomething();
  }
}

public class B extends A {
  protected void __doSomething() {
    // Doing class-B-specific stuff here
    ...
  }
}

然而,第一个要点并不是那么清楚。如果您想要返回不同的内容,则签名无法匹配。

答案 1 :(得分:1)

将回调添加到doSomething()

public class A {
  public void doSomething() {
    // Things that every sub-class should do 
    doSomethingMore()
  }
}

protected abstract void doSomethingMore()

所以所有子程序都必须使用其他操作ipmelment doSomethingMore(),但外部类将调用public doSomething()

答案 2 :(得分:0)

仅针对第一点 - 您可以考虑以下答案,并且为了强制执行子类实现,它可以是抽象的,但如果基类具有某些实现,则可能会发生调用公共代码功能。

返回类型可以是基类中的Object并返回null。在SubClass中,特定的返回类型可以如下所示。

public class InheritanceTutorial {

    static class Base{
        public Object doSomething(){
            System.out.println("parent dosomething");
            return null;
        }
    }

    static class SubClass extends Base{
        public Integer doSomething(){
            super.doSomething();
            System.out.println("child dosomething");
            return 0;
        }
    }

    /**
     * @param args
     */
    public static void main(String[] args) {
        SubClass subClass = new SubClass();
        subClass.doSomething();
    }

}