打字稿多态性

时间:2016-08-22 14:37:35

标签: javascript typescript polymorphism

请看一下这段代码:

class Greeter {
    greeting: string;
    constructor(message: string) {
        this.greeting = message;
    }
    greet() {
        return "Hello, " + this.greeting;
    }
}

class Ge extends Greeter {
    constructor(message: string) {
        super(message);
    }
    greet() {
        return "walla " + super.greet();
    }
}

let greeter = new Ge("world");

console.log(greeter.greet()); // walla Hello, world
console.log((<Greeter> greeter).greet()); // walla Hello, world

我希望第二个日志能够打印Hello, world。 查看已编译的Javascript代码,我看到完全相同的命令,所以这不是一个惊喜。

真正的问题是,你如何将greeter转换为扩展类?

4 个答案:

答案 0 :(得分:5)

JS(和TS)中的方法附加到附加到每个实例的原型(类似于虚方法表)。当您调用方法时,实际函数将从实例的原型链中检索,而不是从对象的已知类型中检索。我所知道的最接近的等价物是C ++中的sleep(1) 方法。

在代码中:

Thread

答案 1 :(得分:4)

您已经将greeter投射到了它的父类。

类中的重写方法在转换为父类时不会改变行为。

答案 2 :(得分:2)

我认为你误解了施法。它不是“转换成”而是“解释为”。它基本上为编译器提供了一个提示,即他正在处理的类型/接口,因此可以使用属性和方法。它没有说明这些方法的实现,只有它们的签名(类型进入,类型出来)

答案 3 :(得分:0)

Casting只告诉编译器将变量视为具有特定类型的变量。

Casting对输出的JavaScript代码没有影响。它有时允许编译器在认为你将类型A视为类型B时不会发出错误。但是JavaScript代码没有类型的概念。

您的类实例有一个名为greet的属性,它隐藏了该对象原型的属性(基类greet函数)。因此,被调用的函数始终是继承行中最低的函数。

您可能希望查看输出代码,然后应用您对原型继承的了解来理解该代码。