我想用fluent api的概念做繼承。所以父類正在定義它的方法并回傳自己(this)。孩子應該能夠使用這個方法,但不是回傳父級,而是回傳它自己的類實體!
我怎樣才能做到這一點? 我想實體化父級,所以抽象不是一個選項。
public class Parent {
// fields, constructor a.s.o
public Parent doSth() {
//doSth
return this;
}
}
public class Child extends Parent{
// fields, constructor a.s.o
}
如果我現在執行..
new Child().doSth() => *is returning Parent, not Child!*
uj5u.com熱心網友回復:
在這種情況下,我們需要承認抽象和繼承之間的沖突,至少在有限的方面。解決它(假設您愿意為呼叫者犧牲介面編程)將取決于幾件事:
Parent.doSth()
不實體化 anew Parent()
并回傳它(你的代碼似乎沒有) - 或者你會為運行時錯誤騰出空間- 您愿意重寫該方法只是為了在鏈式呼叫中攜帶特定型別。當然,這將適用于所有相關方法。
如果這兩個都是肯定的:
class Child extends Parent{
@Override
public Child doSth() {
super.doSth();
return this;
}
}
需要注意的是,這樣做會引發很多問題,其中包括:
- 如果這種父/子關系對您的呼叫者沒有任何意義,那么您還應該問自己為什么
Child
要擴展Parent
。如果您沒有充分的理由,請使用組合而不是繼承。此代碼剝奪了您和您的呼叫者 OOP 的一個關鍵特性(多型性,在Parent
各種子類的物件所持有的型別的意義上) - 覆寫該方法(出于一個不太合理的原因,就原則而言)可能會被解釋為在沒有充分理由的情況下造成維護負擔。
uj5u.com熱心網友回復:
當我嘗試您的代碼時,回傳的實體確實是 Child :
public static void main(String[] args) {
Child child = new Child();
System.out.println(child.getClass());
System.out.println(child.doSth());
}
所以你的代碼似乎有問題。請發布整個代碼。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/469263.html
上一篇:如何反向修改道具的值