Class typescript手册中的继承示例

Class typescript手册中的继承示例,class,oop,object,inheritance,typescript1.4,Class,Oop,Object,Inheritance,Typescript1.4,阅读以下示例: 问题是关于这一行的var-tom:Animal=新马(“帕洛米诺的汤米”): 据我所知,汤姆是一种具有马属性的动物。是这样吗 这样做有什么意义?不声明为var-tom:Horse=… 只有一个版本可以让他有机会退化/改变/进化成蛇或任何其他动物。我说得对吗 …或者只是一个打字错误 在上述示例中,动物是马和蛇的超类(也称为基类或父类)。相应地,马和蛇是动物的子类(派生类) 当您声明子类时: class Snake extends Animal ... class Horse ex

阅读以下示例:

问题是关于这一行的
var-tom:Animal=新马(“帕洛米诺的汤米”)

  • 据我所知,汤姆是一种具有马属性的动物。是这样吗

  • 这样做有什么意义?不声明为
    var-tom:Horse=…

  • 只有一个版本可以让他有机会退化/改变/进化成
    或任何其他
    动物
    。我说得对吗

  • …或者只是一个打字错误


在上述示例中,
动物
超类(也称为基类或父类)。相应地,
动物
子类(派生类)

当您声明子类时:

class Snake extends Animal
...
class Horse extends Animal
您告诉编译器,任何
蛇和
马实际上也是
动物。这使得
Animal
成为该项目“世界”中更广泛的类别
Snake
Horse
将继承
Animal
的属性,但它们可以更改(和/或添加一些自己的属性)使其更加专业化

  • tom
    的声明告诉编译器变量将接受任何
    Animal
    。如前所述,
    动物
    ,因此编译器允许它通过

  • 因此,他们说明了这样一个事实,即每当在任何表达式中需要超类的一个成员时,它的任何子类的一个成员都是可以接受的。这称为协方差

  • 在最字面的意义上,没有进化或转移。线路

    tom:Animal=新马(“帕洛米诺人汤米”)

    首先,创建一个新的
    对象。然后将对象分配给变量
    tom
    ,但此分配不会更改对象的属性。如果运行该示例,您将看到调用
    horse.move()
    实际上调用了
    horse
    版本的方法
    move
    ,该方法将报告“Tommy the Palomino移动了45米”

    分配给
    动物
    的唯一明显的副作用是,变量是最普通的类型,不知道
    的任何特殊属性。它只知道所有动物的共同点。假设
    Horse
    是这样声明的:

    class Horse extends Animal {
        constructor(name: string) { super(name); }
        move(meters = 45) {
            //...
        }
        swat_fly() { /* ... */ }
    }
    
    您将无法调用
    tom.swat\u fly()
    。如果你想,你要么输入
    tom
    (像这样:
    (tom).swat_fly()
    ),要么将它声明为
    ,而不是
    动物
    。但我重申:对象的属性不会更改为超类的属性

  • 所以不,这不是打字错误:)

class Horse extends Animal {
    constructor(name: string) { super(name); }
    move(meters = 45) {
        //...
    }
    swat_fly() { /* ... */ }
}