加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

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,因为那样您将破坏子类型合同.

从理论上讲,子类型可以对其函数参数更加自由,更具体地说它们的返回类型(但反之亦然,就像在你的情况下一样).实际上,编程语言可能要求重写方法中的参数类型必须在任何地方都相同.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读