我正在使用帶有類 A 和 B 的外部庫(我無法修改),它們都有 2 個名稱相同的 getter(getter1 和 getter2)。
A 和 B 之間沒有關系,也沒有定義 2 個 getter 的超類或介面。
在我的代碼中,我想創建一個引數可以是 A 和 B 型別的方法,我想在其上呼叫 getter(不關心傳遞的引數是 A 還是 B 的實體)。
我可以用 getter1 和 getter2 宣告一個介面,但我不能強制類 A 和 B 實作這個介面,因為它們駐留在外部代碼中。
我的代碼中的方法的優雅解決方案是什么?
我不想有 2 種相同的方法,一種帶有 A 引數,一種帶有 B 引數。
uj5u.com熱心網友回復:
如果既不是A也不B是final,那么您可以使用配接器模式。
創建一個介面,其中定義了所需的兩個方法,例如Adapter.
interface Adapter {
String getter1();
String getter2();
}
創建A和 的子類B,每個都實作Adapter.
public class AAdapter extends A implements Adapter {}
public class BAdapter extends B implements Adapter {}
然后您的方法可以采用型別為 的物件Adapter。
如果您不能執行上述操作,因為其中至少有一個是final,那么您將不得不使用組合而不是繼承。不要繼承Aand B,而是將它們包裝在一個 Adapter 類中。
class AAdapter implements Adapter {
A a;
public AAdapter(A a) { this.a = a;}
@Override public String getter1() {
return a.getter1();
}
@Override public String getter2() {
return a.getter2();
}
}
class BAdapter implements Adapter {
B b;
public BAdapter(B b) { this.b = b;}
@Override public String getter1() {
return b.getter1();
}
@Override public String getter2() {
return b.getter2();
}
}
uj5u.com熱心網友回復:
我建議創建您自己的類 A' 和 B',它們使用兩個類共享的方法實作相同的介面。每個類都應該包含相應庫類的一個實體,然后簡單地委托(通過呼叫)該類上的方法。這樣您就不會受到呼叫相同方法的限制。缺點是額外的樣板代碼。但好處是,如果您需要非常簡單,您可以適應第三個庫(例如 C)。
搜索“委托模式”以獲取更多資訊。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/334465.html
上一篇:為什么我無法快速訪問通用成員
下一篇:無效的地圖鍵型別“識別符號”
