abstract 抽象类

抽象类

abstract 用于定义抽象类和其中的抽象方法。app

什么是抽象类?this

首先,抽象类是不容许被实例化的:spa

abstract class Animal {
  public name;
  public constructor(name) {
    this.name = name;
  }
  public abstract sayHi();
}
 
let a = new Animal('Jack');
 
// index.ts(9,11): error TS2511: Cannot create an instance of the abstract class 'Animal'.

 

上面的例子中,咱们定义了一个抽象类 Animal,而且定义了一个抽象方法 sayHi。在实例化抽象类的时候报错了。prototype

其次,抽象类中的抽象方法必须被子类实现:code

abstract class Animal {
  public name;
  public constructor(name) {
    this.name = name;
  }
  public abstract sayHi();
}
 
class Cat extends Animal {
  public eat() {
    console.log(`${this.name} is eating.`);
  }
}
 
let cat = new Cat('Tom');
 
// index.ts(9,7): error TS2515: Non-abstract class 'Cat' does not implement inherited abstract member 'sayHi' from class 'Animal'.

 

上面的例子中,咱们定义了一个类 Cat 继承了抽象类 Animal,可是没有实现抽象方法 sayHi,因此编译报错了。blog

下面是一个正确使用抽象类的例子:继承

abstract class Animal {
  public name;
  public constructor(name) {
    this.name = name;
  }
  public abstract sayHi();
}
 
class Cat extends Animal {
  public sayHi() {
    console.log(`Meow, My name is ${this.name}`);
  }
}
 
let cat = new Cat('Tom');

 

上面的例子中,咱们实现了抽象方法 sayHi,编译经过了。ip

须要注意的是,即便是抽象方法,TypeScript 的编译结果中,仍然会存在这个类,上面的代码的编译结果是:it

var __extends = (this && this.__extends) || function (d, b) {
    for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];
    function __() { this.constructor = d; }
    d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
};
var Animal = (function () {
    function Animal(name) {
        this.name = name;
    }
    return Animal;
}());
var Cat = (function (_super) {
    __extends(Cat, _super);
    function Cat() {
        _super.apply(this, arguments);
    }
    Cat.prototype.sayHi = function () {
        console.log('Meow, My name is ' + this.name);
    };
    return Cat;
}(Animal));
var cat = new Cat('Tom');
相关文章
相关标签/搜索