[英]How to design an inheritance with changing parameter types in php?
這個想法是創建一個類似DOM的樹。 但是有一些限制,只有某些類型可以實際包含其他類型。
我想使用接口|抽象類|超類來實現一些眾所周知的js函數,例如appendChild,replaceChild等。
我正在使用類頁面,塊和項目,其中頁面可以包含塊,而塊可以包含塊或項目。
示例:頁面是網頁,塊可以是列表元素,項目可以是列表項目元素。
但是這些對象不僅僅包含html數據,而且這些概念還超出了普通HTML表示的范圍。 這是管理項目的總體思路,無論它們具有實際的表示形式還是僅僅是抽象的對象。 該概念本身適用於許多不同的層次結構。
我想要實現的是盡可能多地重用父類的代碼(添加子代對於所有類基本上是相同的),但是要使類型提示與允許添加為子代的類型相匹配。
我發現自己的方法基本上有四種:
因此,如果有人仍然願意回答,那么我對任何主張,想法或暗示(選擇哪個選項)都很滿意。 我希望我能很好地描述這個問題。
如果有什么我想念的,我很感激;)
碼
超類方式(有效,但打破了前提繼承實踐)
class Base {
public|protected function appendChild(Base $child) {
// do stuff
}
}
class Block extends Base {
public function appendChild(Block $child) {
parent::appendChild($child);
}
}
接口方式(不起作用。一定不能)
interface Interface1 {
public function appendChild(Base $child);
}
class Base implements Interface1 {
public|protected function appendChild(Base $child) {
// do stuff
}
}
class Block extends Base{
public function appendChild(Block $child) {
parent::appendChild($child);
}
}
編輯的部分以粗體顯示
界面對我來說最有意義。 一個類可以扮演多個角色,因為它可以實現多個接口。
// you don't need any methods in the interfaces
class Foo implements Inline, Block {}
可以同時使用:
appendChild(Inline $foo); and appendChild(Block $foo);
和接口可以互相擴展,因此所有對象都可以有一個通用接口。
您仍然可以使用繼承來重用實現,並且可以靈活地嚴格使用繼承樹來重用實現,而不受頁面邏輯的限制(您永遠不會被迫讓StaticSimpleton
擴展HeavyDatabaseyWidget
)。
如果沒有接口,我將選擇選項5:只需使appendChild
調用$child->canBeChildOf($this)
和/或$this->accepts($child)
。 同樣,邏輯和實現將是獨立的,並且您的邏輯將有很多自由。
PHP在運行tmie時會進行類型檢查,因此使用類型系統並不會給您帶來多少好處。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.