簡體   English   中英

在Java中覆蓋對象實例的最終類的最終方法

[英]Overriding a final method on a final class on an object instance in Java

我們的情況是,我們有一個類“Base”,它有一個最終的 toString() 方法。

我們還有一個擴展“Base”的最終類“Sub”。

需要進行非常具體的更改,並且僅適用於功能的一小部分子集,但如果“正確”完成,可能會變得非常具有侵入性。

實現更改的最簡單方法是在“Sub”類的單個實例上覆蓋 toString 方法。 使用覆蓋的 toString() 創建一個新的 Sub 實例也是一種選擇。

這可能嗎? 關於如何做到這一點的任何建議?

如果您不能更改Base類,刪除final修飾符或更改toString實現以委托給子類,最好的辦法是添加和使用接口:讓BaseSub實現相同的接口,在任何地方使用接口,然后使用組合做你需要做的事情:

class Delegate implements CommonInterface {
  private Base delegate;
  // ++ ctor

  public String toString() {
    return delegate.toString(); // here you are free to change the toString.
  }
}

如果 java 中的任何方法是 final 的,則子類不能覆蓋 final 方法。 如果您堅持在您的 Sub 中使用 toString(),則只有一種方法。 使基類的 toString() 不是最終的。

或者

在您的 Sub 類中獲取一個非靜態最終全局變量,並使用構造函數對其進行初始化,並在需要打印 Sub 類的實例時打印所需的字段。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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