深入理解类和接口
面向对象概述
为什么要讲面向对象
- TS为前端面向对象开发带来了契机
JS语言没有类型检查,如果使用面向对象的方式开发,会产生大量的接口,而大量的接口会导致调用复杂度剧增,这种复杂度必须通过严格的类型检查来避免错误,尽管可以使用注释或文档或记忆力,但是它们没有强约束力。
TS带来了完整的类型系统,因此开发复杂程序时,无论接口数量有多少,都可以获得完整的类型检查,并且这种检查是据有强约束力的。
- 面向对象中有许多非常成熟的模式,能处理复杂问题
在过去的很多年中,在大型应用或复杂领域,面向对象已经积累了非常多的经验。
什么是面向对象
面向对象:Oriented(基于) Object(事物),简称OO。
是一种编程思想,它提出一切以类对切入点思考问题。
其他编程思想:面向过程、函数式编程
学开发最重要最难的是什么?思维
面向过程:以功能流程为思考切入点,不太适合大型应用
函数式编程:以数学运算为思考切入点
面向对象:以划分类为思考切入点。类是最小的功能单元
类:可以产生对象的模板。
如何学习
- TS中的OOP (面向对象编程,Oriented Object Programing)
- 小游戏练习
理解 -> 想法 -> 实践 -> 理解 -> ....
类的继承
继承的作用
继承可以描述类与类之间的关系
坦克、玩家坦克、敌方坦克 玩家坦克是坦克,敌方坦克是坦克
如果A和B都是类,并且可以描述为A是B,则A和B形成继承关系:
- B是父类,A是子类
- B派生A,A继承自B
- B是A的基类,A是B的派生类
如果A继承自B,则A中自动拥有B中的所有成员
@startuml
Tank <|-- PlayerTank
Tank <|-- EnemyTank
EnemyTank <|-- BossTank
@enduml
@enduml
成员的重写
重写(override):子类中覆盖父类的成员
子类成员不能改变父类成员的类型
无论是属性还是方法,子类都可以对父类的相应成员进行重写,但是重写时,需要保证类型的匹配。
注意this关键字:在继承关系中,this的指向是动态——调用方法时,根据具体的调用者确定this指向
super关键字:在子类的方法中,可以使用super关键字读取父类成员
类型匹配
鸭子辨型法
子类的对象,始终可以赋值给父类
面向对象中,这种现象,叫做里氏替换原则
如果需要判断一个数据的具体子类类型,可以使用instanceof
protected修饰符
readonly:只读修饰符
访问权限修饰符:private public protected
protected: 受保护的成员,只能在自身和子类中访问
单根性和传递性
单根性:每个类最多只能拥有一个父类
传递性:如果A是B的父类,并且B是C的父类,则,可以认为A也是C的父类