PHP Class :: load()必须与Interface :: load()兼容

时间:2015-01-15 20:44:04

标签: oop

我有一些课程:

class ClassA implements InterfaceA {
     public function load(Foo $foo) {

     }
}


interface InterfaceA {
     public function load(InterfaceFoo $foo);
}

class Foo implements InterfaceFoo
{

}

我的问题是为什么我的ClassA :: load(Foo $ foo)方法与我的InterfaceA :: load(InterfaceFoo $ foo)不兼容,即使类Foo实现了InterfaceFoo?

我知道我可以按如下方式编写ClassA:

class ClassA implements InterfaceA {
     public function load(InterfaceFoo $foo) {
             if (!($foo instanceof Foo)) {
                 throw new Exception("InterfaceFoo must be an instance of Foo");
             }
     }
}

但我仍然感到困惑,为什么以前的方式不起作用。

1 个答案:

答案 0 :(得分:0)

您不能这样做,因为它违反了InterfaceA合同。

load方法说它可以与InterfaceFoo的任何具体实现一起使用,而不仅仅是特定的实现。 这称为多态,很好。

你可以在你的加载方法中使用dinamically downcast foo param来检查它是否像Foo一样具体实现。