簡體   English   中英

如何從子類重寫/擴展內部類?

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

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM