2012-01-14 132 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

相关问题