写点什么

给前端介绍对象啦!(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:39632

评论

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

OpenAI发布ChatGPT函数调用和API更新

楚少AI

openai GPT-4 ChatGPT4 chatgpt api gpt-3.5-turbo-16k

2023 年最适用于工业物联网领域的三款开源 MQTT Broker

EMQ映云科技

物联网 mqtt mqtt broker

体验 TDengine 3.0 高性能的第一步,请学会控制建表策略

爱倒腾的程序员

涛思数据 时序数据库 #TDengine

推动绿色计算 共迎绿色未来|2023开放原子全球开源峰会绿色基础设施技术分论坛圆满收官

开放原子开源基金会

开源 开放原子全球开源峰会 开放原子 绿色基础设施技术

推动开源行业高质量发展|2023开放原子全球开源峰会圆满落幕

开放原子开源基金会

开源 开发原子全球开源峰会 开发原子

深度学习应用篇-元学习[14]:基于优化的元学习-MAML模型、LEO模型、Reptile模型

汀丶人工智能

人工智能 深度学习 元学习 元强化学习 6 月 优质更文活动

用友入选信通院“铸基计划”IPaaS标准贡献单位

用友BIP

数智平台

消失的死锁:从 JSF 线程池满到 JVM 初始化原理剖析 | 京东云技术团队

京东科技开发者

JVM 线程池 jsf 企业号 6 月 PK 榜

软件测试/测试开发丨Python类与对象学习笔记

测试人

Python 程序员 软件测试 测试开发 类与对象

银行数字化转型研究与敏捷转型探索

L3C老司机

数字化转型 敏捷转型 敏捷组织 银行转型 敏捷探索

河北国控携手用友探索数智司库,加快建设世界一流

用友BIP

全球司库

Battery Indicator for Mac:Mac笔记本电脑电池电量剩余百分比显示工具

背包客

macos Mac软件 MacBook Pro Battery Mac电量显示软件

直播App必看!消息收发技巧,让你实力up up!

山东布谷科技

App 源码搭建 视频语音直播app开发 开发软件 直播APP源码

“升级数智底座”中央企业创新发展沙龙在中国科技城(绵阳)举办!

用友BIP

数智底座 数智平台

智慧隧道三维可视化管控平台系统

2D3D前端可视化开发

物联网 数字孪生 三维可视化 智慧隧道 智慧公路隧道

你应该搞懂的 C 语言头文件路径问题

矜辰所致

C语言 头文件 6 月 优质更文活动

南宁建宁水务集团财务共享、全面预算项目正式启动

用友BIP

打造科学新高地|2023开放原子全球开源峰会科学智能分论坛圆满举行

开放原子开源基金会

开源 开放原子全球开源峰会 开放原子 科学智能

重庆企业购买堡垒机选择哪家好?理由有哪些?

行云管家

网络安全 堡垒机 重庆

用友承办全国两化融合标委会工业互联网管理标准工作组全体成员大会圆满召开

用友BIP

工业互联网

火山引擎DataLeap:一个易用、高效的数据目录,是如何搭建的?

字节跳动数据平台

大数据 数据治理 数据目录 数据研发

《中国电子报》专访简丽荣:“模型热”将引发云计算与数据库行业大变革

酷克数据HashData

深度学习应用篇-元学习[13]:元学习概念、学习期、工作原理、模型分类等

汀丶人工智能

人工智能 深度学习 元学习 元强化学习 6 月 优质更文活动

万物云原生下的服务进化 | 京东云技术团队

京东科技开发者

Java 云原生 镜像 GraalVM 企业号 6 月 PK 榜

北京国际开源社区正式启航

开放原子开源基金会

开源 开放原子全球开源峰会 开放原子 北京国际开源社区

还在为618电商推送方案烦恼?我们帮你做好了!

HarmonyOS SDK

HMS Core

公有云数据库新趋势,企业降本增效正当时

MatrixOrigin

数据库 分布式 云原生 超融合 HTAP

如何成功实施一个数据治理项目?实施步骤有哪些?

袋鼠云数栈

数字化转型 数据治理 企业号 6 月 PK 榜

探讨开源法律共识|2023开放原子全球开源峰会开源法律与合规分论坛成功举办

开放原子开源基金会

开源 开放原子全球开源峰会 开放原子 开源知识产权

C4D主流渲染器,到底选哪一款?

Finovy Cloud

大促质量备战之三化战役:“常态化、精细化、一体化” | 京东云技术团队

京东科技开发者

测试 质量 电商大促 企业号 6 月 PK 榜

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