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

Java 如何从子类重写/扩展内部类?,java,Java,我想更改类的方法在不重写方法的情况下执行的方式,并且只重写(或理想地扩展)内部类。假设我不能改变我需要这样做的事实(我正在修改一个现有的开源代码库,在拉出类或诸如此类的东西时会有摩擦) 我的目标是,通过改变惟一的东西,让B的toString()返回“30”,而现在它将返回“20”。理想的做法是只更改方法值2(从而保留任何其他方法不变),但我不知道这是否可行 谢谢仅更改值2是不可能的。问题是“new”调用不是动态调度的——toString中的“new”总是会创建一个::Thing。您可以通过创建一

我想更改类的方法在不重写方法的情况下执行的方式,并且只重写(或理想地扩展)内部类。假设我不能改变我需要这样做的事实(我正在修改一个现有的开源代码库,在拉出类或诸如此类的东西时会有摩擦)

我的目标是,通过改变惟一的东西,让B的toString()返回“30”,而现在它将返回“20”。理想的做法是只更改方法值2(从而保留任何其他方法不变),但我不知道这是否可行


谢谢

仅更改值2是不可能的。问题是“new”调用不是动态调度的——toString中的“new”总是会创建一个::Thing。您可以通过创建一个工厂来解决此问题:类似这样:

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

  private Thing makeThing() { return new Thing(); }


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

public class B extends A {
  static class Thing extends A.Thing {
    public int value2() { return 20; }
  }

  private Thing makeThing() { return new Thing(); }

}

您应该能够使用Thing扩展A.Thing来扩展内部类。只要它在您的范围内可见,就不会有问题。

我认为您需要一种工厂方法来实现这一点。考虑下面的示例(从您的代码片段中派生):

输出:

30

你似乎在使用C++对象语法,而不是java。我希望每一盎司的优雅。谢谢因为我一开始没有看到它,所以我想强调这需要在外部类中重写createThing。我相信没有办法从A的子类重写A的内部类“Thing”中的方法(我希望听到其他的说法),相反,你要用一个新的B.Thing替换A.Thing,它在B的命名空间中隐藏,但对A中的方法不可见。要使用它,你必须更新外部类中的每个引用。
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