资讯专栏INFORMATION COLUMN

TS 类与接口

garfileo / 741人阅读

摘要:二正文中与的区别接口只声明成员方法,不做实现。在中,我们可以采用全新的基于类继承的模式设计更优雅的语义化接口,这是因为中的可以继承动态构造的类,这一点和其他的静态声明类的编程语言不同。

一 前言

1.在typescript上遇到过实例化对象的两种写法:implement和extends。extends很明显就是ES6里面的类继承,那么implement又是做什么的呢?它和extends有什么不同?

2.还有一个问题就是:typescript 有接口的概念,这个接口和类有什么关系吗?

带着以上两个问题我们一起看一下这篇文章。

二 正文 1.ts中interface与class的区别

interface:接口只声明成员方法,不做实现。

class:类声明并实现方法。

也就是说:interface只是定义了这个接口会有什么,但是没有告诉你具体是什么。
例如:

interface Point {
    lng:number;
    lat:number;
    sayPosition():void;
}

Point interface 里面包含数值类型的经纬度和一个sayPosition函数,但是具体内容没有定义,需要你自己在子类中实现。

而class则是完整的实现:

class Point {
    constructor(lng,lat){
        this.lng = lng;
        this.lat = lat;
    }
    sayPosition(){
        console.log("point:",this.lng,this.lat);
    }
}
2.extends 与 implement

(1)extends是继承父类,只要那个类不是声明为final或者那个类定义为abstract的就能继承。

(2)java中不支持多重继承,但是可以用接口来实现,这样就要用到implements,继承只能继承一个类,但implements可以实现多个接口,用逗号分开就行了
比如:

 class A extends B implements C,D,E

在英文中:
implements 就是:实现的意思。
“implement是实现一个接口,要自己实现这个接口的方法”
implements就是实现的意思,顾名思义它实现一个已经定义好的接口中的方法!如:

public interface MyInterface{
    public String MyInterfaceMethod1ToReturnString();
    public void MyIntefaceMethod2();
    ......
    //在这里定义一系列不需要实现的方法,其实现过程"延续到"他的子类中
}

实现接口方法:

public MyImplClass implements MyInterface{
    public String MyInterfaceMethod1ToReturnString(){
         return "My String here!";
    }
    public void MyIntefaceMethod2(){
         //Do something else here!
    }
}
3.ES6中使用Mixin实现“多重继承”

熟悉 JavaScript 的同学应该对 mixin 模式并不陌生。我们说 JavaScript / ES5 的继承模型是基于单一原型链的继承模型,通常情况下,在 JavaScript 实践中完全用原型链来实现继承式的代码复用,是远远不能满足需求的。因此实战中,我们的代码抽象基本上都是采用混合的模式,既有原型继承,也有 mixin 组合。

在 ES6 中,我们可以采用全新的基于类继承的 “mixin” 模式设计更优雅的“语义化”接口,这是因为 ES6 中的 extends 可以继承动态构造的类,这一点和其他的静态声明类的编程语言不同。

const Serializable = Sup => class extends Sup {
  constructor(...args){
    super(...args);
    if(typeof this.constructor.stringify !== "function"){
      throw new ReferenceError("Please define stringify method to the Class!");
    }
    if(typeof this.constructor.parse !== "function"){
      throw new ReferenceError("Please define parse method to the Class!");
    }
  }
  toString(){
    return this.constructor.stringify(this);
  }
}

class Person {
  constructor(name, age, gender){
    Object.assign(this, {name, age, gender});
  }
}

class Employee extends Serializable(Person){
  constructor(name, age, gender, level, salary){
    super(name, age, gender);
    this.level = level;
    this.salary = salary;
  }
  static stringify(employee){
    let {name, age, gender, level, salary} = employee;
    return JSON.stringify({name, age, gender, level, salary});
  }
  static parse(str){
    let {name, age, gender, level, salary} = JSON.parse(str);
    return new Employee(name, age, gender, level, salary);
  }
}

let employee = new Employee("jane",25,"f",1,1000);
let employee2 = Employee.parse(employee+""); //通过序列化反序列化复制对象

console.log(employee2, 
  employee2 instanceof Employee,  //true 
  employee2 instanceof Person,  //true
  employee == employee2);   //false

在上面的代码里,我们改变了 Serializable,让它成为一个动态返回类型的函数,然后我们通过 class Employ extends Serializable(Person) 来实现可序列化,在这里我们没有可序列化 Person 本身,而将 Serializable 在语义上变成一种修饰,即 Employee 是一种可序列化的 Person。

三 后记

参考链接:
Classes
类的装饰器:ES6 中优雅的 mixin 式继承

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/95321.html

相关文章

  • 【Java】抽象类与接口

    摘要:在抽象类中,声明的是,可是。抽象类只能作为子类的超类,子类继承抽象类时必须被实现。它根本不存在方法的实现实现子类使用关键字来继承抽象类。添加新方法如果你往抽象类中添加新的方法,你可以给它提供默认的实现。转自,抽象类与接口的区别 抽象类与接口 抽象类与接口一样,都不能被实例化,可以有具体实现的方法,也可以有抽象的方法。在抽象类中,声明的field是static、final,method可...

    mengbo 评论0 收藏0
  • java学习(三) —— 面对对象

    摘要:前言是面对对象的语言,因此有必要单独纪录下对象的各种定义和理解。面对对象基本概述概述是基于面向过程的变成思想,是对面向过程的一种封装。面对对象开发就是不断的创建对象,使用对象,指挥对象做事情。面对对象设计其实就是在管理和维护对象之间的关系。 前言 java是面对对象的语言,因此有必要单独纪录下对象的各种定义和理解。 面对对象,主要包括:面向对象思想,类与对象及其使用,对象的内存图,成...

    褰辩话 评论0 收藏0
  • Java抽象类与接口的区别

    摘要:很多常见的面试题都会出诸如抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口这样的问题。在讨论它们之间的不同点之前,我们先看看抽象类接口各自的特性。抽象类抽象类是用来捕捉子类的通用特性的。 很多常见的面试题都会出诸如抽象类和接口有什么区别,什么情况下会使用抽象类和什么情况你会使用接口这样的问题。本文我们将仔细讨论这些话题。 在讨论它们之间的不同点之前,我们先看看抽象类...

    Ethan815 评论0 收藏0
  • Java抽象类与接口

    摘要:抽象类和接口抽象类抽象方法是只有方法签名,没有方法实现的方法。抽象类不能被实例化,抽象类可以包含方法抽象和普通成员变量构造器初始化块内部类接口枚举种成分。抽象类的构造器不能用于创建实例,主要用于被其子类调用。 抽象类和接口 1.抽象类 抽象方法是只有方法签名,没有方法实现的方法。有抽象方法的类只能被定义成抽象类,抽象类可以没有抽象方法。抽象方法和抽象类必须使用abstract修饰符来定...

    wdzgege 评论0 收藏0
  • 【modernPHP专题(4)】抽象类与接口

    摘要:抽象类支持抽象类和抽象方法。接口是一种特殊的抽象类,这种抽象类中只包含抽象方法和静态常量。对抽象类的使用是通过关键字。抽象类中可以声明各种类型成员变量,实现数据的封装。一个类可以同时实现多个接口,但一个类只能继承于一个抽象类。 抽象类 php5支持抽象类和抽象方法。类前加 abstract, 此类就成为抽象类,无法被实例化,此类天生就是用来被继承的,给子类提供了一个类的模板;类方法前加...

    Keven 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<