Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
抽象方法中的PHP类型提示接口和类型提示接口';方法实现中的子类_Php_Oop - Fatal编程技术网

抽象方法中的PHP类型提示接口和类型提示接口';方法实现中的子类

抽象方法中的PHP类型提示接口和类型提示接口';方法实现中的子类,php,oop,Php,Oop,假设我有一个简单的界面: interface A {} class B implements A {} class C implements A {} 然后,我有一些实现该接口的类: interface A {} class B implements A {} class C implements A {} 然后,我有一个类,它有一个方法,该方法期望类B的对象作为参数(我不能在这里使用接口类型提示,因为只有类B具有类D需要的一些独特特性): 但是,我还有另一个类,它使用相同的方法,现在期

假设我有一个简单的界面:

interface A {}
class B implements A {}
class C implements A {}
然后,我有一些实现该接口的类:

interface A {}
class B implements A {}
class C implements A {}
然后,我有一个类,它有一个方法,该方法期望类B的对象作为参数(我不能在这里使用接口类型提示,因为只有类B具有类D需要的一些独特特性):

但是,我还有另一个类,它使用相同的方法,现在期望类C的对象作为参数(我不能在这里使用接口类型提示,因为只有类C具有类E所需的一些独特功能):

类D和E的对象必须在其他地方使用,我必须确保这些对象将具有method
foo
,因此我得出以下结论(抽象类在这里不是错误,不应该使用接口,因为在现实生活中这个类也应该包含一些非抽象方法):

然后我编辑了我的类,以便它们扩展类DE:

class D extends DE 
{
    public function foo(B $bar); // class B implements A
}

class E extends DE 
{
    public function foo(C $bar); // class C implements A
}
在我看来,这段代码在逻辑上是有效的,因为我们可能会遇到我在本文中试图描述的情况,但我惊讶地看到消息中出现致命错误:声明。。必须与…兼容

因此,我的问题如下:如何确保几个对象将有一个特定的方法,并且每个对象中的方法将只接受特定对象作为参数?

到目前为止,我看到的唯一解决办法是如下所示(但我相信有更好的解决方案):


一个问题是D类和E类分别需要具体的B类和C类。既然您应该阻止类继承,我将尽可能避免在方法签名中放置具体的类。如果您的类需要使用一个具体的类,请不要泄露该信息,将其保密

因此,最好有:

public function foo(SomethingAbstract $noIdeaWhatIAmButIDoStuff) {
    $concrete = SomethingConcreteThatMakesUseOfAbstract($noIdeaWhatIAmButIDoStuff);
}
比:

public function foo(SomethingConcrete $tmi) {

}
我建议按照以下思路思考:

abstract class DE {

    public abstract function foo(A $a);

}

class D extends DE {

    public function foo(A $a) {
        $b = new B($a);
        //do with $b what you please
    }

}

class E extends DE {

    public function foo(A $a) {
        $c = new C($a);
        //now you can use $c which will leverage $a
    }

}
如果B和C对象还需要实现A(如您的示例中所示),那么您有一个装饰器模式。

可能很有用。
public function foo(SomethingConcrete $tmi) {

}
abstract class DE {

    public abstract function foo(A $a);

}

class D extends DE {

    public function foo(A $a) {
        $b = new B($a);
        //do with $b what you please
    }

}

class E extends DE {

    public function foo(A $a) {
        $c = new C($a);
        //now you can use $c which will leverage $a
    }

}