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() { /* ... */ }
}