2012-01-14 131 views
5

我對PHP OOP和類型提示有奇怪的問題。這裏有一個例子:PHP OOP「實現必須兼容」

abstract class AC {} 

class C extends AC {} 

interface I { 
    function method(AC $abstract); 
} 

class InterfaceImplementation implements I { 
    function method(C $concrete) {} 
} 

此代碼將無法運行,說method不與接口聲明兼容。我認爲它是兼容的,因爲C擴展AC - 我想念什麼?我如何期望實現這種功能?

+4

我不同意這是兼容的,你的'接口I'表示一個契約'方法'接受_any_'AC',而不僅僅是'C' ......我會同意'InterfaceImplementation'事實上不是實施'我'。 – Wrikken 2012-01-14 14:37:28

回答

4

想象一下,你有一個類B其中也延伸AC。然後I要求它的任何實現也接受B作爲方法的參數。然而,你的InterfaceImplementation沒有。

大圖:如果您需要在實現中指定具體類型,您可能需要重新考慮您的設計。這個想法是,對於外界來說,所有需要了解的信息都是由AC編碼的,並且不應該有任何需要知道正在傳輸哪個具體子類的InterfaceImplementation。也許具體的東西可以嵌入到C的代碼中,並通過一種方法調用AC?

另一種更新:您可能可以使用泛型實現您想要的功能,但我不認爲它們存在於PHP。我仍然認爲,如果你分享了設計的細節問題,可能使另一個有趣的問題:)

+1

它會接受'B' ....除非你的意思是'B'擴展'AC',在這種情況下你是正確的。 – Wrikken 2012-01-14 14:40:57

+0

我看,謝謝你的解釋 – Fluffy 2012-01-14 14:41:57

+0

對不起,意思是說「外殼AC」不是「擴展C」 - 固定 – Nicolas78 2012-01-14 14:41:57

1

只是把它定義爲:

class InterfaceImplementation implements I { 
    function method(AC $concrete) {} 
} 

而且隨着C的情況下,即調用它。 ->method(new C());。上Object Interfaces

PHP的參考手冊中明確規定:

實現該接口必須使用完全相同的方法簽名作爲在界面中所定義的類。不這樣做會導致致命的錯誤。

+0

是啊,但我想他想限制InterfaceImplementation只接受C參數 – Nicolas78 2012-01-14 15:14:14

相關問題