现如今,TS正在逐渐成为前端OO编程的不二之选,以下是我在学习过程中对抽象类和接口做的横向对比。

1. 抽象类当做父类,被继承。且抽象类的派生类的构造函数中必须调用super();接口可以当做“子类”继承其他类

抽象类派生:

abstract class Human {
constructor (readonly name:string) {} } class Student extends Human {
constructor (name:string) {
super(name)
}
}

接口继承类:

class Man {
job: string;
constructor (readonly name: string) {}
earnMoney () {
console.log(`earning money`)
}
} interface HumanRule extends Man{
nose: string;
mouth: string;
ear: string;
eye: string;
eyebrow: string
}

当类被接口继承时,通常是需要为这个类的子类添加约束。例如下面的例子中,Man类的子类就需要去实现特定的五官属性,否则将会报错。

class Player extends Man implements HumanRule{
nose: string;
mouth: string;
ear: string;
eye: string;
eyebrow: string
constructor (name) {
super(name);
}
}

2. 抽象类与接口都无法实例化, 类类型接口实际上是一种 抽象类型

按个人理解,在使用类类型的接口时,类类型的接口其实就相当于抽象类的子集。抽象类中除了可以像接口那样只定义不实现外,还可以部分实现,而且也可以使用类型修饰符。

类类型的接口更多的是当做一种抽象的数据类型使用,此处所说的类型通常是某个类的实例类型。

let James: Player = new Player('james');  // 类类型使用

class SoccerPlayer extends Player {
constructor (name) {
super(name)
} playSoccer () {
console.log(`${this.name} is playing soccer.`)
}
} function createPlayer (pl: SoccerPlayer, name: string) { // 类类型调用
return new SoccerPlayer(name);
}

3. 接口中不能包含具体实现,抽象类中除抽象函数之外,其他函数可以包含具体实现

此处我们将Human类增加一些内容:

abstract class Human {
constructor (readonly name:string) {}
protected thinking () {
console.log(`I am a human, so i can think, ${this.name} is thinking.`)
}
}

作为人类,可以在人类 这个类中添加具体实现,因为人类都可以思考。所以思考这个类就不必非要放到子类中去具体实现,这也正是抽象类的灵活之处。

4. 抽象类中的抽象方法在子类中必须实现, 接口中的非可选项在接口被调用时必须实现。

此处我们继续增加Human类的内容,增加move的具体实现方法为抽象方法,因为不同类型的人,移动的实现不同。(此处实际上也是OO的特性中,多态的一种具体实现)

abstract class Human {
constructor (readonly name:string) {}
protected thinking () {
console.log(`I am a human, so i can think, ${this.name} is thinking.`)
}
abstract move (): void
} class Student extends Human {
constructor (name:string) {
super(name)
} move () {
console.log(`I am a student, so i move by bus`)
}
}

而接口一旦调用,就必须要严格实现。此处以函数类型的接口为例:

interface createPlayer {
(pl: SoccerPlayer, name:string): SoccerPlayer
} let createPlayer:createPlayer = function (pl: SoccerPlayer, name: string) { // 修改createPlayer 使用匿名函数方法创建
return new SoccerPlayer(name);
}

5. 抽象方法可当做类的实例方法,添加访问修饰符;但是接口不可以

抽象方法的添加访问修饰符和接口的严格实现其实都是各自的特点,我们也往往是根据这些特点去选择究竟是使用抽象类还是使用接口。

还拿Human类来说:

abstract class Human {
constructor (readonly name:string) {}
protected thinking () {
console.log(`I am a human, so i can think, ${this.name} is thinking.`)
}
protected abstract move (): void
}

我们为move方法添加abstract标识符,是想让开发者非常明白,Human的派生类中必须要实现此方法;而使用protected标识符,是想限制move方法调用或重载的权限。

综合来说抽象类更多的是实现业务上的严谨性;接口更多的是制定各种规范,而此规范又分为很多类规范,就像官方文档在介绍接口这一节的时候所说的,例如函数型规范、类类型规范、混合规范、索引规范等。

Typescript中抽象类与接口详细对比与应用场景介绍的更多相关文章

  1. “全栈2019”Java第六十六章:抽象类与接口详细对比

    难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...

  2. 转:二十一、详细解析Java中抽象类和接口的区别

    转:二十一.详细解析Java中抽象类和接口的区别 http://blog.csdn.net/liujun13579/article/details/7737670 在Java语言中, abstract ...

  3. C#中抽象类和接口的区别

    原文:C#中抽象类和接口的区别 大家在编程时都容易把抽象类和接口搞混,下面为大家从概念上讲解抽象类和接口的区别: 一.抽象类: 含有abstract修饰符的class即为抽象类,抽象类是特殊的类,只是 ...

  4. 关于JAVA中抽象类和接口的区别辨析

    今天主要整理一下新学习的有关于Java中抽象类和接口的相关知识和个人理解. 1 抽象类 用来描述事物的一般状态和行为,然后在其子类中去实现这些状态和行为.也就是说,抽象类中的方法,需要在子类中进行重写 ...

  5. java 8中抽象类与接口的异同

    1.java 8中抽象类与接口的异同 相同点: 1)都是抽象类型: 2)都可以有实现方法(以前接口不行): 3)都可以不需要实现类或者继承者去实现所有方法,(以前不行,现在接口中默认方法不需要实现者实 ...

  6. 谈谈php中抽象类和接口的区别

    php中抽象类和接口的区别 1) 概念 面向对象的三大概念:封装,继承,多态 把属性和方法封装起来就是类.        一个类的属性和方法被另外的类复制就是继承,PHP里面的任何类都可以被继承,被继 ...

  7. PHP中抽象类与接口的区别

    PHP中抽象类与接口的区别 抽象类abstract 概念 定义为抽象的类不能被实例化.任何一个类,如果有一个方法是被声明为抽象的,那么这个类就必须被声明为抽象的类. 继承一个抽象类的时候,子类必须定义 ...

  8. 转载:详细解析Java中抽象类和接口的区别

    在Java语言中, abstract class 和interface 是支持抽象类定义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和int ...

  9. 详细解析Java中抽象类和接口的区别

    在Java语言中, abstract class 和interface 是支持抽象类定 义的两种机制.正是由于这两种机制的存在,才赋予了Java强大的 面向对象能力.abstract class和in ...

随机推荐

  1. Confluence 6 外部参考

    一个外部参考的意思是任何站点链接到你 Confluence 的实例.任何时候当 Confluence 的用户单击这个外部链接的时候,Confluence 可以记录这次单击为参考. 在默认的情况下,外部 ...

  2. LeetCode(98): 验证二叉搜索树

    Medium! 题目描述: 给定一个二叉树,判断其是否是一个有效的二叉搜索树. 一个二叉搜索树具有如下特征: 节点的左子树只包含小于当前节点的数. 节点的右子树只包含大于当前节点的数. 所有左子树和右 ...

  3. Deal with Warning: mysqli::__construct(): (HY000/2002)

    1.安装XAMPP之后,如果之前安装过MySQL或者 apache,启动XAMPP中的响应的服务的时候回出现报错, 出错的原因,具体看报错的原因,如果是端口占用,在配置中修改端口号,如果是提示 “Fo ...

  4. AI-跨域、垃圾回收、content_type组见、接口处理

    AI-跨域.垃圾回收.content_type组见.接口处理 跨域 为什么有跨域?什么时候遇见的?答:由于浏览器的同源策略 阻止ajax请求 不阻止src请求:在测试时,项目上线后不会遇见跨域.源:协 ...

  5. Idea和PyCharm激活破解

    1. 先去百度去官网下载专业版IDE, Idea 和PyCharm激活方法一样 2. 下载破解包, 点击下载 3. 将下载的jar包放到这个安装目录的bin目录下面 4. 在bin目录下面的文件pyc ...

  6. tensorflow实现RNN及Word2Vec

    参考:<tensorflow实战> 首先介绍一下Word2Vec Word2Vec:从原始语料中学习字词空间向量的预测模型.主要分为CBOW(Continue Bags of Words) ...

  7. 浅拷贝和深拷贝(谈谈java中的clone)

    clone顾名思义就是复制, 在Java语言中, clone方法被对象调用,所以会复制对象.所谓的复制对象,首先要分配一个和源对象同样大小的空间,在这个空间中创建一个新的对象.那么在java语言中,有 ...

  8. 史上最简单的SpringCloud教程 | 第二篇: 服务消费者(rest+ribbon)

    在上一篇文章,讲了服务的注册和发现.在微服务架构中,业务都会被拆分成一个独立的服务,服务与服务的通讯是基于http restful的.Spring cloud有两种服务调用方式,一种是ribbon+r ...

  9. C++ 成员初始化列表

    1.什么是成员初始化列表 #include<iostream> #include<string> using namespace std; class Weapon { pri ...

  10. javascript扩充基本类型的功能

    可以通过给Function.prototype增加方法来使得该方法对所有函数可用. 通过给Function.prototype增加一个method方法,下次给对象增加方法的时候就不必键入prototy ...