我有一些课程:
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");
}
}
}
但我仍然感到困惑,为什么以前的方式不起作用。
答案 0 :(得分:0)
您不能这样做,因为它违反了InterfaceA合同。
load
方法说它可以与InterfaceFoo的任何具体实现一起使用,而不仅仅是特定的实现。
这称为多态,很好。
你可以在你的加载方法中使用dinamically downcast foo param来检查它是否像Foo一样具体实现。