2010-05-12 46 views
4

可以說我有一個父類有沒有什麼辦法可以在php中實現多重繼承?

class parent { } 

..... 

這位家長有三個子類

class child1 { } 

class child2 { } 

class child3 { } 

這些子類有更小的部件,如

class child1subpar1 { } 

class child1subpar2 { 

     public function foo() { 
      echo "hi"; 
     } 

} 

class child2subpar1 { } 

class child2subpar2 { } 

現在,如何總結這整個像

class child1 extends child1subpar1, child1subpar2 { } 
class child2 extends child2subpar1, childsubpar1 { } 

class parent extends child1,child2,child3 { } 

我需要執行其繼承類中的方法並執行類似的操作

$ objparent = new parent; $ objparent - > foo();

+1

最基本的問題是你有倒退。孩子們延長他們的父母,而不是相反。 – deceze 2010-05-12 01:40:58

回答

2

不,但多重繼承通常被認爲是不好的做法。你應該喜歡構圖,所以你只需要在你的類中使用你想要繼承的類的實例。

現在,當我再次查看您的問題時,它甚至不是繼承問題,您應該使用組合。也許如果你提供了更多的細節你期望這個班級做什麼,我們應該更準確地回答。

UPDATE:

您將需要爲每個類,你可能需要使用方法的一種方法 - 這就是所謂的外觀設計模式。或者,也許你不知道,你可以這樣調用內部對象的方法:

$parent->subObject->subSubObject->wantedMethod(); 

Facade模式:

http://en.wikipedia.org/wiki/Facade_pattern

你的情況門面

不會比創建一個類別的並定義您想要使用的每一種方法,並在該方法內調用任何內部實例的任何方法。但我真的沒有看到任何好處,而不是調用 分層次的實例和方法

+0

你是說通過創建單獨的對象分別執行不同類的方法? – Starx 2010-05-12 01:23:22

+0

我不確定你的問題是什麼,因爲你的問題不是很具體。但我說你應該在你的父對象內部創建你所謂的子類的實例,並根據需要調用方法。如果沒有你更好地解釋你的問題,我不認爲我可以更有用 – marianboda 2010-05-12 01:28:40

+0

所有的子類和實際上組成大類的部分就像一個「網頁」包含「頭」,「身體」和身體包含橫幅,內容,頁腳,並且橫幅包含flashheader,菜單欄。我試圖創建一個網頁類的實例,並試圖顯示整個網頁在一個擊打 – Starx 2010-05-12 01:33:37

2

好像你真的很困惑面向對象。

父級沒有意識到其子女。如果你想執行一個子類,你需要創建它的實例。

PHP中也不允許多繼承(以及許多其他流行語言,如Java)。

可能值得關注聚合 - 將較小的子類傳遞給子類或事件父類。另外,您可以使用實現多個接口來強制子類具有一組必需的方法。

+0

+1同意 - 「你可以使用實現多個接口來強制子類有一套所需的方法」 – falomir 2010-05-12 01:25:32

+0

但我想執行所有方法使用父類的一個實例 – Starx 2010-05-12 01:28:27

+1

@starx,對不起,隊友,這是不可能的。發明自己的語言:D – iBiryukov 2010-05-12 01:31:33

1

你在做什麼是真的倒退。繼承用於在沒有代碼重複的情況下爲對象提供通用的共享功能。繼承從父母到孩子,父母可以做的所有事情,孩子可以做得很好,但它可以做得更多(擴展了父母的功能)。

class Parent { 

    function everyoneCanDoThis() { } 

} 


class Child extends Parent { 

    // I can implicitly use the everyoneCanDoThis() function 

    function onlyChildrenCanDoThis() { } 

} 

由於這是一種自頂向下的結構,所以父母不應該依賴任何特定的孩子。父母不執行或調用孩子的功能。只有調用Child的函數,但是這些函數可以從Parent類繼承。

你應該把你想要的每個對象的所有東西都放在Parent類中。只與特定對象相關的特定功能進入Child。

的多重繼承是不同的CAN蠕蟲是不可能在PHP中,有充分理由的。當您獲得繼承的基礎知識時,請回到作文,就像這裏其他地方所建議的那樣。 :)


組成只是意味着你拿幾個對象,並在另一個對象舉行引用。它與繼承無關,因爲這些對象中的每一個都可能會或可能不會從父類繼承,並且它們仍然是單獨的對象。

class ComposedObject { 

    private $part1 = null; 
    private $part2 = null; 

    public function __constructor() { 
     $this->part1 = new Part1(); 
     $this->part2 = new Part2(); 
    } 

    public function doTask() { 
     return $this->part1->doSomeTask(); 
    } 

    public function doOtherTask() { 
     return $this->part2->doSomeOtherTask(); 
    } 

} 

的ComposedObject沒有任何功能本身,繼承或其他方式。但它擁有兩個其他對象,每個對象都具有一些功能。在「零件」的功能可以被直接暴露,所以它們被稱爲像$composedObject->part1->doSomeTask(),它們可以被封裝作爲例子,所以它們被稱爲像$composedObject->doTask(),並在內部授權,或者你可以使用一些__call() trickery自動委託函數在組合對象上調用它的一個「部分」。儘管如此,這與多重繼承有同樣的問題。如果兩個「零件」都包含一個同名的方法,你打電話給哪一個?

+0

你能解釋一下關於作文的一點點嗎? – Starx 2010-05-12 01:58:41

+0

@Starx我說過後來回來哦,哦......; o)更新了一個作文的例子。 – deceze 2010-05-12 03:44:08

0

一個類可以實現多個接口,這是一個稍微不同的事情。

當你從父母繼承,你得到它,除非你選擇覆蓋一切的東西,再加上你可以通過添加額外的更具體的東西延伸,但家長不應該知道孩子什麼。

當你實現一個接口時,接口定義了方法,但是它並沒有實現它們。這取決於你實施它。不同的類可以實現接口方法,只要他們遵循接口說的話。

繼承往往被過度使用,並導致不好的方案。也許如果你告訴我們你想要解決什麼問題,我們其中一個人可以建議你如何構建你的課程。

0

在Php中使用接口也許可以解決問題。

1

+1給其他人。你真的有倒退。孩子總是擴大他們的父母。

但有一些甚至可以在PHP行爲有點像多重繼承:修飾模式。 我寫了一篇關於它的文章on my blog here

相關問題