我正在用Java編寫一個Deck
類。我只想要頂部Card
可以訪問。我正在考慮讓Deck
延伸Stack
,但Stack
繼承自Vector
,它有一個方法add(int, E)
。爲什麼Stack
允許您在其中的任何位置添加元素?有沒有辦法去除/不允許調用這個方法?爲什麼java.util.Stack允許.add(int,E)?
另一方面,也許我完全在想這個錯誤。有沒有更好的方法來製作Deck
課程?我應該讓它擴展和/或實現不同的類和/或接口嗎?
我正在用Java編寫一個Deck
類。我只想要頂部Card
可以訪問。我正在考慮讓Deck
延伸Stack
,但Stack
繼承自Vector
,它有一個方法add(int, E)
。爲什麼Stack
允許您在其中的任何位置添加元素?有沒有辦法去除/不允許調用這個方法?爲什麼java.util.Stack允許.add(int,E)?
另一方面,也許我完全在想這個錯誤。有沒有更好的方法來製作Deck
課程?我應該讓它擴展和/或實現不同的類和/或接口嗎?
我會用一個deque(也明顯甲板)堆棧和Vector幾乎20年前設計和deque是一個相對較新的設計(約8歲)
堆棧不使用的界面,允許它來隱藏這些方法對於預期目的沒有意義。
堆棧是一箇舊類,就像Vector一樣,不應該再使用。你不能「禁用」這個方法,因爲正如你所指出的,Stack擴展了Vector,它有這個方法。而一個子類擴展了超類可以做的事情,而不是限制它。這就是多態的原則。既然一個Vector可以刪除它,並且由於一個Stack是一個Vector,它也可以做到這一點。
考慮使用Collections.asLifoQueue(new LinkedList());
堆棧延伸向量位於Java庫壞設計的一個例子(見從有效的java this)。
這個項目建議,我會避免從容器繼承,而是使用組合
謝謝,我會檢查出來! –
爲了完整:['ArrayDeque':*當用作堆棧時,該類可能比Stack快,並且在用作隊列時比LinkedList快。*](http://docs.oracle.com/javase/ 7/docs/api/java/util/ArrayDeque.html) – Holger
是的,這看起來像它會工作_much_好於堆棧哈哈,謝謝! –