PHP ClassA::load() 必须与 InterfaceA::load() 兼容
PHP ClassA::load() must be compatible with InterfaceA::load()
我有一些 classes:
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) 不兼容,即使 class 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");
}
}
}
但我仍然很困惑为什么以前的方法不起作用。
你不能这样做,因为它违反了 InterfaceA 协定。
load
方法表示它可以与 InterfaceFoo 的任何具体实现一起使用,而不仅仅是特定的实现。
这称为多态性并且很好。
您可以在加载方法中动态向下转换 foo 参数,以检查它是否是像 Foo 这样的具体实现。
我有一些 classes:
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) 不兼容,即使 class 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");
}
}
}
但我仍然很困惑为什么以前的方法不起作用。
你不能这样做,因为它违反了 InterfaceA 协定。
load
方法表示它可以与 InterfaceFoo 的任何具体实现一起使用,而不仅仅是特定的实现。
这称为多态性并且很好。
您可以在加载方法中动态向下转换 foo 参数,以检查它是否是像 Foo 这样的具体实现。