簡體   English   中英

如何在PHP中通過更改參數類型來設計繼承?

[英]How to design an inheritance with changing parameter types in php?

這個想法是創建一個類似DOM的樹。 但是有一些限制,只有某些類型可以實際包含其他類型。

我想使用接口|抽象類|超類來實現一些眾所周知的js函數,例如appendChild,replaceChild等。

我正在使用類頁面,塊和項目,其中頁面可以包含塊,而塊可以包含塊或項目。

示例:頁面是網頁,塊可以是列表元素,項目可以是列表項目元素。

但是這些對象不僅僅包含html數據,而且這些概念還超出了普通HTML表示的范圍。 這是管理項目的總體思路,無論它們具有實際的表示形式還是僅僅是抽象的對象。 該概念本身適用於許多不同的層次結構。

我想要實現的是盡可能多地重用父類的代碼(添加子代對於所有類基本上是相同的),但是要使類型提示與允許添加為子代的類型相匹配。

我發現自己的方法基本上有四種:

  1. 我使用一個接口,該接口允許我向超類鍵入提示,但不能更改它們。
  2. 我將超類與公共方法一起使用,因此可以重新定義類型提示(在繼承先決條件時,這完全違反了常規做法)。
  3. 我使用帶有受保護方法的超類,這似乎仍然很古怪。
  4. 我擺脫了任何超類,只是多次定義幾乎相同的類。
  5. 盡管有類型提示功能,但我還是使用一種方法來檢查類型。

因此,如果有人仍然願意回答,那么我對任何主張,想法或暗示(選擇哪個選項)都很滿意。 我希望我能很好地描述這個問題。

如果有什么我想念的,我很感激;)

超類方式(有效,但打破了前提繼承實踐)

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM