六.继承与多态
1. 类的组合和继承(继承===“是、像”、“父与子”,组合===“需要”、“整体与局部”)
组合:在类中创建对象进行使用
继承:类与类之间的父子关系,子类继承父类的方法和属性
- 在子类中,parent关键字代表父类,self代表自身,用::运算符,又叫范围解析操作符,调用父类的方法
- 继承的缺陷:
~ 继承破坏封装性
~ 继承是紧耦合的
~ 继承扩展复杂
~ 不恰当的使用继承可能违反现实世界的逻辑(角色与权限问题) - 继承的使用
~ 被继承的类要设计好,继承树不要超过三层
~ 使用final修饰符对不能被继承的类进行修饰。使用final修饰符不仅可防止重要的方法被非法覆写,又能给编辑器寻找优化的机会
~ 优先考虑使用组合关系来提高代码的可重用性
~ 子类是一种特殊的类型,而不只是父类的一个角色
~ 子类扩展,而不是覆盖或者使父类的功能失效
~ 底层代码多用组合,顶层/业务层代码多用继承。底层用组合可以提高效率,避免对象臃肿。顶层代码用继承可以提高灵活性,让业务使用更方便。
traits
PHP 5.4中的traits,是新引入的特性,中文还真不知道如何准确翻译好。其实际的目的,是为了有的场合想用多继承,但PHP又没多继承,于是就发明了这样的一个东西。
Traits可以理解为一组能被不同的类都能调用到的方法集合,但Traits不是类!不能被实例化。先来例子看下语法:
<?php
trait myTrait{
function traitMethod1(){}
function traitMethod2(){}
}
//然后是调用这个traits,语法为:
class myClass{
use myTrait;
}
//这样就可以通过use myTraits,调用Traits中的方法了,比如:
$obj = new myClass();
$obj-> traitMethod1 ();
$obj-> traitMethod2 ();
>
2. 各种语言中的多态
多态
- 多态就是同一对象在运行时的具体化
- 多态性是一种通过多种状态或阶段描述相同对象的编程方式
- 意义在于:实际开发中,只要关心一个接口或基类的编程,而不必关心一个对象所属的具体类
- 区别是否是多态的关键在于看对象是否属于同一类型。如果把它们看成同一类型,调用相同的函数,返回了不同的结果,那么他就是多态。
- 多态的本质就是if...else ,只是实现的层级不同
- 多态的本质就是if...else ,只是实现的层级不同