2012-10-11 60 views
0

這裏有一個基本的前提,我使用db對象的活動記錄模式,我想我需要一些指導如何組織這些類。一般來說,我可能會分裂我的班級結構。希望我不會太過分地解釋這一點。如果構圖模式是要走的路,我可能需要一個小小的手來執行它。類結構可能需要實現組合來模仿多重繼承

假設有ActiveRecord基類,在圖騰柱的底部處理將對象映射到數據庫和將數據映射到對象。

ActiveRecord的孩子是一類通用的User類,它處理用戶會話,登錄,保存密碼字段的加密等。

ActiveRecord的另一個孩子是​​類。通常這門課與User無關,但這是我的問題。

我想要一個子類,基本上是User和​​的組合; UserButSlightlyMoreAdvanced,而不必複製粘貼來自User的所有方法。 User擴展​​沒有任何意義,因爲它需要基本上覆蓋一些對User有不良行爲的方法。 UserButSlightlyMoreAdvanced擴展​​是有意義的,但我不得不從User複製和粘貼一堆方法。

我知道有些人會用圖片更好地思考,所以這裏說明了結構。

基地

class ActiveRecord 
{ 
    .... 
} 

兒童

class User extends ActiveRecord 
{ 
    .... 
} 

另外兒童

class ActiveRecordButSlightlyMoreAdvanced extends ActiveRecord 
{ 
    .... 
} 

的問題

class UserButSlightlyMoreAdvanced extends User AND ActiveRecordButSlightlyMoreAdvanced 
{ 
     :(:(:(
} 

我一直在考慮這個問題大約一個月,現在想不到一個解決方案,如果他們中的一個實現保存的方式發生了變化,那麼這個解決方案不會負擔維護對象的負擔。我將在接下來的幾天嘗試一些解決方案,並可能發佈我認爲在這種情況下最好的解決方案。

回答

1

我的猜測是,你的意思是說這個:

class UserButSlightlyMoreAdvanced extends User AND ActiveRecordButSlightlyMoreAdvanced 
{ 
    :) :) :) 
} 

如果是這樣的情況下,考慮性狀http://php.net/manual/en/language.oop5.traits.php

+0

你是對的><。我覺得我的輕微錯字有點摧毀了我的問題。 – Anther

0

您可以嘗試使用的策略模式。在這種情況下,你會創建類:

class UserButSlightlyMoreAdvanced extends ActiveRecord implements ActiveRecordButSlightlyMoreAdvancedStrategy 
{ 
    private $_strategy; 

    public function useStrategy(ActiveRecordButSlightlyMoreAdvancedStrategy $s) { 
     $this->_strategy = $s; 
    } 
} 

,讓你的策略類:

interface ActiveRecordButSlightlyMoreAdvancedStrategy 
{ 
     // Define what this should do here 
} 

做一個策略類實現上述接口。

class ActiveRecordButSlightlyMoreAdvanced implements ActiveRecordButSlightlyMoreAdvancedStrategry { 
    // Do stuff here 
} 

現在當你調用這些先進的方法,這兩個類實現相同的接口,但UserButSlightlyMoreAdvanced類只是通過對戰略目標傳遞請求:

class UserButSlightlyMoreAdvanced extends ActiveRecord implements ActiveRecordButSlightlyMoreAdvancedStrategy 
    { 
     private $_strategy; 

     public function useStrategy(ActiveRecordButSlightlyMoreAdvancedStrategy $s) { 
      $this->_strategy = $s; 
     } 

     public function someSlightlyMoreAdvancedFunction() { 
      return $this->_strategy->someSlightlyMoreAdvancedFunction(): 
     } 
    } 

希望有所幫助。