一尘不染

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

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

我的目标是通过仅更改Thing,使B的toString()返回“ 30”,当前在该位置将返回“
20”。理想的情况是仅更改方法value2(从而使任何其他方法保持不变),但是我不知道这是否可行。

谢谢


阅读 183

收藏
2020-12-03

共1个答案

一尘不染

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

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

输出:

30
2020-12-03