考虑以下内容:
class A{}
class B extends A{}
interface I{
// expects object instanceof A
function doSomething(A $a);
}
class C implements I
{
// fails ????
function doSomething(B $b){}
}
在我看来,上述代码应该可以工作,但实际运行时,php拒绝了这个实现方式,要求第一个参数的类型(A)必须与接口(I)中定义的一模一样。由于B是A的子类,我不明白问题出在哪里。我有什么遗漏吗?
B
扩展了A
,那么没有理由C::doSomething()
只接受B
,而不是所有A
类型的对象。 - MchlI
的契约。如果接口指定可以使用A调用doSomething
,而您的实现不能使用A调用(任何A,不仅仅是A的子集),那么您的代码肯定没有实现所需的行为。 - vbence