如何从子类重写/扩展内部类?

A Q*_*ker 34 java

我想改变类的方法如何在不覆盖方法的情况下执行,并且只覆盖(或理想地扩展)内部类.假设我无法改变我需要这样做的事实(我正在修改一个现有的开源代码库,并且会有拉动类或诸如此类的东西).

public class A {
  static class Thing {
    public int value() { return 10+value2(); }
    public int value2() { return 10; }
  }

  public String toString() {
    Thing t = new Thing();
    return Integer.toString(t.value());
  }
}

public class B extends A {
  static class Thing {
    public int value2() { return 20; }
  }
}
Run Code Online (Sandbox Code Playgroud)

我的目标是,只改变Thing,让B的toString()返回"30",目前它将返回"20".理想的情况是只更改方法value2(因此保持其他任何方法不变),但我不知道这是否可行.

谢谢

dac*_*cwe 41

我认为你需要一种工厂方法.请考虑以下示例(从您的代码段派生):

static class A {
    static class Thing {
        public int value() {
            return 10 + value2();
        }
        public int value2() {
            return 10;
        }
    }
    protected Thing createThing() {
        return new Thing();
    }
    public String toString() {
        return Integer.toString(createThing().value());
    }
}

static class B extends A {
    static class Thing extends A.Thing {
        public int value2() {
            return 20; 
        }
    }
    @Override
    protected Thing createThing() {
        return new Thing(); // creates B.Thing
    }
}

public static void main(String[] args) {
    System.out.println(new B());
}
Run Code Online (Sandbox Code Playgroud)

输出:

30
Run Code Online (Sandbox Code Playgroud)

  • 由于我最初没有看到它,我想强调这需要覆盖外部类中的createThing.我相信没有办法从A的子类中覆盖A的内部类"Thing"中的方法.(我希望另外听到)而是用一个新的B.Thing替换A.Thing,这个B.Thing在B的命名空间中隐藏但是在A中的方法不可见.要使用它,您必须更新外部类的每个引用. (4认同)