写点什么

给前端介绍对象啦!(TypeScript 版)(三)

  • 2020-01-07
  • 本文字数:1916 字

    阅读完需:约 6 分钟

给前端介绍对象啦!(TypeScript版)(三)

多态:我就是我,不一样的烟火

多态是指同一个方法在子类中具有不同表现形式。例如:Dog 类和 Cat 类都有 eat ()/say ()方法,尽管都是来自 Animal 定义的 eat ()/say ()方法,但运行结果完全不同。


(温馨提示:左右滑动可查看全部代码)


class Cat extends Animal {       public eat() {//多态 扩展原方法               super.eat();               console.log("I like eating fish");       }       public say() {               console.log("Miao~");       }       public catchMouse() {               //...       }}
复制代码


测试用例:


let myCat: Animal = new Cat("XiaoHua", 3);       myCat.eat();//I am eating someting     I like eating fish       myCat.say();//Miao~
复制代码

接口

接口:没有规矩不成方圆


接口即规范,规定了某种能力必须要实现的方法。例如:Flyable 接口规定了具有飞行能力必须实现 fly()方法。Bird 和 Plane 类都实现了 Flyable 接口,具有飞行能力。


(温馨提示:左右滑动可查看全部代码)


interface Flyable {       fly();}interface catchBug {       catchBug();}class Bird extends Animal implements Flyable,catchBug {       public say() {               console.log("Ji~Ji~Zha~Zha~");       }       public fly() {               console.log("I am flying with flapping my wings");       }       public catchBug() {               //...       }}class Plane implements Flyable {       fly() {               console.log("I am flying with my engines");       }       takePeople() {               //...       }}
复制代码


测试用例:


(温馨提示:左右滑动可查看全部代码)


let flyable1: Flyable = new Bird("Polly", 1);       flyable1.fly(); //I am flying with flapping my wings       // flyable1.eat();//编译报错: 不存在eat()
let flyable2: Flyable = new Plane(); flyable2.fly();//I am flying with my engines
复制代码

抽象类与接口:有同有异

抽象类和接口很类似,都有未实现的方法,等待其他类去实现。区别是:抽象类可以有一些成员的实现,而接口没有成员的实现;一个类只能继承自一个抽象类,但可以实现多个接口。例如:Animal 类,有抽象方法 say(),也有已实现的方法;上面 Bird 类只能继承自一个类,但又同时实现了 flyable()/catchBug()两个接口。

OOP 设计原则

李氏替换原则:父债可以子来偿


所有引用基类的地方必须能透明的使用其子类的对象,因为子类的对象具有基类所有的属性和方法。(注:基类是指父类/父类的父类等)但反过来就不行了,有需要子类的地方,基类未必就能适应。例如:上面代码中,我们可以将 Dog 对象和 Cat 对象赋值给了 Animal 类型的变量。下面代码中,People 构造函数需要一个 Animal 类型的参数,我们传入了 Dog 类型的对象。


(温馨提示:左右滑动可查看全部代码)


class People extends Animal{       constructor(public name: string, public age: number,public pet: Animal) {               super(name,age);       };       public say(){               console.log(`My name is ${this.name}, I am ${this.age} years old, my pet's name is ${this.pet.name}`);       }}
复制代码


测试用例:


(温馨提示:左右滑动可查看全部代码)


let myBrother: People = new People("XiaoMing", 18, new Dog("GouDan", 2));      myBrother.say();//My name is XiaoMing, I am 12 years old, my pet's name is GouDan      console.log('totalNum='+Animal.totalNum);//totalNum=5 //Dog/Cat/Bird/Dog/People/
复制代码


依赖倒置原则:面向接口编程,大家都依赖接口


在无接口的代码组织中,是高层模块依赖低层模块。如果按照面向对象编程依赖倒置原则,高层模块和低层模块不互相依赖,他们都依赖于其接口/抽象类。例如:如果不存在接口,直接调用 Bird 类/Plane 类的 fly()方法,那么调用者便依赖于 Bird 类/Plane 类。在上面例子中采用了接口编程,调用者的调用依赖于 Flyable()接口;Bird 类和 Plane 类的实现都依赖于 Flyable()接口。


请看下图,原本高层模块向下依赖的箭头,变为低层模块向上依赖的箭头。这就是依赖倒置名称的由来。


无接口:



有接口,依赖倒置:


其他设计原则

单一职责、开闭原则、接口隔离、迪米特法则等其他 OOP 设计原则呢,后会有期。

总结

在一切皆对象的世界中,我们已经学习了面向对象三大特征——封装、继承、多态,和两条面向对象设计原则——李氏替换原则、依赖倒置原则。后面有机会再介绍其他 OOP 设计原则和 GoF 设计模式。


本转载自 Think 体验设计公众号。


原文链接:https://mp.weixin.qq.com/s/CXaasAzRMk3mD_waWv8DHQ


2020-01-07 15:39560

评论

发布
暂无评论
发现更多内容

远程办公暴露过程管理的不足

持续交付实践指南

管理 软件工程 远程办公

Week 10

一叶知秋

架构师训练营第十周作业

qihuajun

Dubbo微服务框架请求流程

GalaxyCreater

架构

第十周命题作业

赵龙

Newbe.Claptrap 框架如何实现 Claptrap 的多样性?

newbe36524

容器 微服务 .net core ASP.NET Core

炸裂!40+图万字长文拿下HTTP

我是程序员小贱

计算机网络

Go make 和 new 的区别

曲镇

make Go 语言

架构师训练营--第10周作业

Just顾

六张图从HTTP/0.9进化到HTTP3.0

执鸢者

大前端 网络 HTTP

腾讯一面面试官让我关闭连接

我是程序员小贱

第十周作业

方堃

第十周学习总结

赵龙

链表应用之设计高性能访客记录系统

架构师修行之路

数据结构 链表 架构师

招银网络问了啥?这么尬?妥妥的安排

我是程序员小贱

troubleshoot之:使用JFR解决内存泄露

程序那些事

Java 内存泄露 性能调优

如何优雅的编写GO程序?

八两

优雅 语法 Go 语言

架构师训练营第十章总结

叮叮董董

关于微服务架构(中台架构、领域驱动设计、组件设计原则)的一点思考

jason

Dubbo源码分析--dubbo-config配置层的套路

jason

Code Review 失败后总结的几个实践技巧

Phoenix

团队管理 团队协作 技术人 代码质量

微服务与DDD学习总结

qihuajun

我期待,这是个多彩的世界

瓜藤老祖

大三儿 乐队的夏天 九连真人

架构师训练营第十章作业

叮叮董董

芯片破壁者(十一):回看日本半导体的倾塌

脑极体

socket通信,你还会实现么?

小隐乐乐

有意思:Go函数的闭包

申屠鹏会

闭包 函数 Go 语言

[翻译]分布式系统的模式-综述

流沙

架构 分布式系统

40张图入门Linux——(前端够用,运维入门)

执鸢者

Linux 大前端

热乎的宇宙条总部面经,已拿offer,速来围观

我是程序员小贱

可读代码编写炸鸡十 - 保持单纯

多选参数

代码质量 代码 代码优化 可读代码编写 可读代码

给前端介绍对象啦!(TypeScript版)(三)_文化 & 方法_Think体验设计_InfoQ精选文章