public class testhashsetextends hashset
@override
public boolean add(e e)
@override
public boolean addall(collection<? extends e> c)
public int getcount()
public static void main(string args) ));
system.out.println(hashset.getcount());
}}
按照預想的會列印輸出3,但實際上列印輸出6。這是因為,addall()方法內部實現呼叫了add()方法,因此總共的次數就是3+3=6。這種情況就是父類方法中」自用性「導致的。那麼,針對由繼承帶來的問題應該如何解決?
採用復合/**的方式重寫上面的testhash,包含了兩個部分:新類本身以及被包含的**類:
public class instrumentedsetextends forwardingset
@override
public boolean add(e e)
@override
public boolean addall(collection<? extends e> c)
public int getaddcount()
}// reusable forwarding class
public class forwardingsetimplements set
public void clear()
public boolean contains(object o)
public boolean isempty()
public int size()
public iteratoriterator()
public boolean add(e e)
public boolean remove(object o)
public boolean containsall(collection<?> c)
public boolean addall(collection<? extends e> c)
public boolean removeall(collection<?> c)
public boolean retainall(collection<?> c)
public object toarray()
public t toarray(t a)
@override
public boolean equals(object o)
@override
public int hashcode()
@override
public string tostring() }
在上面這個例子裡構造了兩個類,乙個是用來擴充套件操作的包裹類,乙個是用來與現有類進行互動的**類,可以看到,在現在這個實現中包裹類不再直接擴充套件set,而是擴充套件了他的**類,而在**類內部,現有set類是作為它的乙個資料域存在的,**類實現了set介面,這樣它就包括了現有類的基本操作。每個**動作都直接呼叫現有類的相應方法並返回相應結果。這樣就將信賴於set的實現細節排除在包裹類之外。有的時候,復合和**的結合被錯誤的稱為"委託(delegation)"。從技術的角度來說,這不是委託,除非包裝物件把自身傳遞給被包裝的物件。
java 組合優於繼承
組合和繼承,都能實現對類的擴充套件。區別如下表所示 組合 繼承has a關係 is a關係 執行期決定 編譯期決定 不破壞封裝,整體和區域性松耦合 破壞封裝,子類依賴父類 支援擴充套件,隨意增加組合類 只能繼承乙個父類,必須包含所有方法,增加系統複雜性 動態選擇組合類方法 復用父類方法 下面通過乙個...
java 組合優於繼承
組合和繼承。都能實現對類的擴充套件。差別例如以下表所看到的 組合繼承has a關係 is a關係 執行期決定 編譯期決定 不破壞封裝,總體和區域性松耦合 破壞封裝,子類依賴父類 支援擴充套件,任意新增組合類 僅僅能繼承乙個父類,必須包括全部方法,新增系統複雜性 動態選擇組合類方法 復用父類方法 以下...
繼承 or 復合?
django已經連續寫了很多篇,這裡先暫停一下,換換口味,實際上有了之前的簡單介紹,如果有一些web開發基礎的,已經可以開發了。後續我還會寫一些文章進行說明。今天介紹的內容在開發中很有意義,所以拿出來和大家聊聊,希望對大家今後的工作有所幫助。繼承是物件導向的重要概念,是依賴關係的一種,主要用來實現類...