[英]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.