《TypeScript实战指南》—3.2.3 继承

举报
华章计算机 发表于 2019/06/16 13:19:20 2019/06/16
【摘要】 本节书摘来自华章计算机《TypeScript实战指南》一书中的第3章,第3.2.3节,作者是胡桓铭。

3.2.3 继承

在TypeScript里,我们可以使用常用的面向对象模式。基于类的程序设计中一种最基本的模式是允许使用继承来扩展现有的类。

看下面的例子:

class Animal {

    move(distanceInMeters: number = 0) {

        console.log(`Animal moved ${distanceInMeters}m.`);

    }

}

 

class Dog extends Animal {

    bark() {

        console.log('Woof! Woof!');

    }

}

 

const dog = new Dog();

dog.bark();

dog.move(10);

dog.bark();

这个例子展示了最基本的继承:类从基类中继承了属性和方法。这里,Dog是一个“派生类”,它通过extends关键字派生自Animal“基类”。派生类通常称为“子类”,基类通常称为“超类”。

因为Dog继承了Animal的功能,因此可以创建一个Dog的实例,能够执行bark()和move()。

下面我们来看一个更加复杂的例子:

class Animal {

    name: string;

    constructor(theName: string) { this.name = theName; }

    move(distanceInMeters: number = 0) {

        console.log(`${this.name} moved ${distanceInMeters}m.`);

    }

}

 

class Snake extends Animal {

    constructor(name: string) { super(name); }

    move(distanceInMeters = 5) {

        console.log("Slithering...");

        super.move(distanceInMeters);

    }

}

 

class Horse extends Animal {

    constructor(name: string) { super(name); }

    move(distanceInMeters = 45) {

        console.log("Galloping...");

        super.move(distanceInMeters);

    }

}

 

let sam = new Snake("Sammy the Python");

let tom: Animal = new Horse("Tommy the Palomino");

 

sam.move();

tom.move(34);

这个例子展示了一些上面没有提到的特性。这一次,我们使用extends关键字创建了Animal的两个子类:Horse和Snake。

与前一个例子的不同点是,派生类包含了一个构造函数,它必须调用super(),并会执行基类的构造函数。而且,在构造函数里访问this的属性之前一定要调用super()。这是TypeScript强制执行的一条重要规则。

这个例子演示了如何在子类里重写父类的方法。Snake类和Horse类都创建了move方法,它们重写了从Animal继承来的move方法,使得move方法根据不同的类而具有不同的功能。注意,即使tom被声明为Animal类型,但因为它的值是Horse,调用tom.move(34)时,它会调用Horse里重写的方法,如下所示:

Slithering...

Sammy the Python moved 5m.

Galloping...

Tommy the Palomino moved 34m.


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。