抽象类和类的类型

215 阅读2分钟

抽象类

以abstract修饰的类是抽象类,和其他类区别不大,只是不能用来创建实例对象,抽象类的作用是用来被继承的类。

//抽象类Animal
 abstract class Animal {
    name:string;
    age:number;
    constructor(name:string,age:number){
        this.name=name;
        this.age=age;
    }
    sayHellow(){
        console.log('动物在叫~');
    }
}

const animal=new Animal()

image.png

image.png

抽象成员

抽象类中可以添加抽象方法和抽象属性,也是用abstract来修饰。定义的抽象成员表示需要子类实现。如果子类没有实现抽象成员就会报错。定义的抽象方法没有方法体不需要实现功能,子类需要对抽象方法进行重写实现方法体功能。抽象方法只能定义在抽象类中。

abstract class A {
  abstract foo:string;
  bar:string = '';
  abstract sayHi():void;
}

class B extends A {

}

上面示例中,抽象类A定义了抽象属性foo和抽象方法sayHi,子类B必须实现这个属性和方法,否则会报错。

image.png

 abstract class Animal {
    name:string;
    age:number;
    abstract foo:string;
    constructor(name:string,age:number){
        this.name=name;
        this.age=age;
    }
    abstract sayHi():void;
}

class Cat extends Animal{
    // 子类实现抽象属性
    foo = 'b';
    // 子类必须给出抽象方法的实现
    sayHi(): void {
        console.log('喵喵喵~~~');
    }
}

const cat =new Cat('maomao',3);
console.log(cat);
cat.sayHi();

image.png

抽象方法:父类定义一个方法不去实现,让继承的子类去实现,每一个子类有不同的表现形式。

注意点:

(1)抽象成员只能存在于抽象类,不能存在于普通类。

(2)抽象成员不能有具体实现的代码。也就是说,已经实现好的成员前面不能加abstract关键字。

(3)抽象成员前也不能有private修饰符,否则无法在子类中实现该成员。

(4)一个子类最多只能继承一个抽象类。

抽象类的作用是确保各种相关的子类都拥有跟基类相同的接口,可以看作是模板。其中的抽象成员都是必须由子类实现的成员,非抽象成员则表示基类已经实现的、由所有子类共享的成员。

类的类型

给类加上 TypeScript 的类型很简单,与接口类似:变量的类型定义可以定义为一个类。

class Animal {
  name: string;
  constructor(name: string) {
    this.name = name;
  }
  sayHi(): string {
    return `My name is ${this.name}`;
  }
}

let a: Animal = new Animal('Jack');
console.log(a.sayHi()); // My name is Jack