博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《Hack与HHVM权威指南》——1.5.2 覆盖方法的类型
阅读量:5968 次
发布时间:2019-06-19

本文共 913 字,大约阅读时间需要 3 分钟。

本节书摘来自华章出版社《Hack与HHVM权威指南》一书中的第1章,第1.5.2节,作者 Owen Yamauchi,更多章节内容可以访问云栖社区“华章计算机”公众号查看。

1.5.2 覆盖方法的类型

在Hack的代码之间,继承是更加复杂的相互关系中的一种。这复杂性主要来自于当继承关系被创建时,继承和被继承的代码之间的分离现象。举例来说,如果你有个类型标注为SomeClass的对象并可以调用这个对象的某个方法,那么你可以调用继承自SomeClass的任何类的某个方法。这个调用仍然需要是类型安全的,这就意味着覆盖其他方法的时候,方法的类型必须有一定的规则。

在一个覆盖方法中,参数类型必须和被覆盖的方法类型完全一致。这主要是因为继承自PHP的一个行为。在PHP中,任何覆盖自抽象方法或者接口中声明的覆盖方法,都必须精确地匹配被覆盖方法的参数类型。这在未来Hack版本中的声明可能会有所改变,允许改变方法的参数类型将是更通常的做法。
换句话说,当进行方法覆盖时,覆盖方法的返回类型并不一定保持相同,相对于被覆盖的方法而言,覆盖方法可以有一个更加明确的返回类型。例如:

class ParentClass {  public function generate(): num {    // ...  } }class ChildClass extends ParentClass {  public function generate(): int {  // OK    // ...  } }

虽然改变了返回类型,这种多态的调用仍然是类型安全的。

function f(ParentClass $obj) {
$number = $obj->generate();
// 即使$obj是个ChildClass实例,generate()方法自然会返回num类型
// 因为ChildClass::generate() 返回的是int类型,而所有int类型都属于num类型
用更通常的返回类型进行覆盖是非法的。例如,如果ChildClass的generate()方法被声明成返回类型为mixed的话,类型检查器将会报告错误。

转载地址:http://schax.baihongyu.com/

你可能感兴趣的文章
SpringMVC架构
查看>>
JAVA团队开发手册 - 2.代码管理
查看>>
超详细步骤 | 如何用小程序 SDK 实现电商评价模
查看>>
Android 类库
查看>>
vue和iview应用中的一些问题(持续更新)
查看>>
基于 Workman 实现Web扫描登录
查看>>
karma如何与测试框架合作2之webpack
查看>>
关于VSCode更新对于emmet2.0支持的配置更改问题。
查看>>
二叉树的遍历
查看>>
三元组相加获得target
查看>>
10分钟搭建MySQL Binlog分析+可视化方案
查看>>
vmware虚拟机配置串口
查看>>
小型自动化运维--expect脚本之传递函数
查看>>
Exchange Server 2010部署安装之一
查看>>
Nsrp实现juniper防火墙的高可用性【HA】!
查看>>
Android 动态移动控件实现
查看>>
oracle11g 安装在rhel5.0笔记
查看>>
解决Lync 2013演示PPT提示证书问题的多种方法
查看>>
[转]经典正则表达式
查看>>
JDBC+Servlet+JSP整合开发之26.JSP内建对象
查看>>