[英]How to override/extend an inner class from a subclass?
我想改变类的方法如何在不覆盖方法的情况下执行,并且只覆盖(或理想地扩展)内部类。 假设我不能改变我需要这样做的事实(我正在修改一个现有的开源代码库,并且会有拉动类或诸如此类的东西)。
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(因此保持其他任何方法不变),但我不知道这是否可行。
谢谢
我认为你需要一种工厂方法。 请考虑以下示例( 从您的代码段派生 ):
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
您应该能够使用Thing extends A.Thing扩展内部类。 只要它在你的范围内可见,它应该不是问题。
仅通过改变value2是不可能的。 问题是“新”调用不会动态调度 - toString中的“new”将始终创建A :: 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(); }
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.