【问题标题】:How to ensure a certain methods gets called in abstract super-class from method in sub-class (Java)如何确保从子类中的方法(Java)在抽象超类中调用某些方法
【发布时间】:2015-11-01 11:49:37
【问题描述】:

我有一个抽象超类 A,其方法为 doSomething()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() 调用该通用方法。

任何想法应该如何实现这些方法?

【问题讨论】:

    标签: java inheritance


    【解决方案1】:

    接下来呢?

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

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

    【讨论】:

    • OP想要返回一些东西,所以你可以将__doSomething()的返回类型改为泛型类型T
    • 非常感谢,这种方式(与 Kachanov 相同)适用于我的目的。抱歉不清楚返回值的事情,但是使用回调机制解决了返回值问题。
    【解决方案2】:

    添加回调到 doSomething()

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

    所以所有子类都必须使用额外的操作来 ipmelment doSomethingMore(),但外部类将调用 public doSomething()

    【讨论】:

    • 我会将final 添加到public void doSomething()。这应该保证它不会被子类覆盖(Naive Coder(我在 2 个月内)可能会这样做)。
    【解决方案3】:

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

    返回类型可以是基类中的Object,返回null。在子类中,具体的返回类型可以如下所示。

    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();
        }
    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-02-15
      • 2014-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-07
      • 2020-07-15
      • 2012-09-21
      相关资源
      最近更新 更多