PHP接口实现拒绝参数的子类
发布时间:2020-12-13 21:40:03 所属栏目:PHP教程 来源:网络整理
导读:考虑一下: 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那样拒绝那种要求第一个
考虑一下:
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那样拒绝那种要求第一个参数与接口(I)中定义的完全相同的类型(A)的实现.既然B是A的子类,我看不出问题是什么.我在这里错过了什么吗? 解决方法
C类实现I意味着C和I之间必须存在子类型关系.这意味着类型C的对象应该可以在需要类型I的对象的任何地方使用.
在你的情况下,C比我更具限制性,因为它对doSomething参数有更精确的要求 – I.doSomething适用于任何A但C.doSomething需要A的特定子类型 请注意,如果您更改C.doSomething以接受任何A,那么没有什么可以阻止您传递类型B的对象.您只是不能只需要B,因为那样您将破坏子类型合同. 从理论上讲,子类型可以对其函数参数更加自由,更具体地说它们的返回类型(但反之亦然,就像在你的情况下一样).实际上,编程语言可能要求重写方法中的参数类型必须在任何地方都相同. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |