我有几门课
class ClassA implements InterfaceA {
public function load(Foo $foo) {
}
}
interface InterfaceA {
public function load(InterfaceFoo $foo);
}
class Foo implements InterfaceFoo
{
}
我的问题是,为什么我的类A::load( Foo $foo)方法与我的接口A::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");
}
}
}
但我还是很困惑为什么以前的方法行不通。
发布于 2015-01-15 21:21:05
您不能这样做,因为它违反了InterfaceA协议。
load
方法表示,它可以与InterfaceFoo的任何具体实现一起工作,而不仅仅是特定的实现。这就是所谓的多态,而且是好的。
您可以在load方法中以极小的方式降低Foo参数,以检查它是否是像foo这样的具体实现。
https://stackoverflow.com/questions/27972640
复制相似问题