【问题标题】:inheritance example from typescript manual来自打字稿手册的继承示例
【发布时间】:2015-09-14 16:19:27
【问题描述】:

阅读来自typescript manual的例子:

class Animal {
    name:string;
    constructor(theName: string) { this.name = theName; }
    move(meters: number = 0) {
        alert(this.name + " moved " + meters + "m.");
    }
}

class Snake extends Animal {
    constructor(name: string) { super(name); }
    move(meters = 5) {
        alert("Slithering...");
        super.move(meters);
    }
}

class Horse extends Animal {
    constructor(name: string) { super(name); }
    move(meters = 45) {
        alert("Galloping...");
        super.move(meters);
    }
}

var sam = new Snake("Sammy the Python");
var tom: Animal = new Horse("Tommy the Palomino");

sam.move();
tom.move(34);

问题是关于var tom: Animal = new Horse("Tommy the Palomino");这一行:

  • 据我了解,tom 是一个具有Horse 属性的Animal。那正确吗?

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

  • 只有一个版本让他有机会降级/更改/进化为Snake 或任何其他Animal。我说的对吗?

  • ...或者这只是一个错字?

【问题讨论】:

    标签: class oop object inheritance typescript1.4


    【解决方案1】:

    在上面的示例中,AnimalHorseSnake。相应地,HorseSnakeAnimal子类派生类)。

    当你声明子类时:

    class Snake extends Animal
    ...
    class Horse extends Animal
    

    您是在告诉编译器每个Snake 和每个Horse 实际上也是一个Animal。这使得Animal 成为程序“世界”中更广泛的类别。 SnakeHorse继承 Animal 的属性,但他们可以更改(和/或添加他们自己的一些)以更加专业 .

    • tom 的声明告诉编译器该变量将接受任何Animal。正如我们之前看到的,HorseAnimal,所以编译器让它通过。

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

    • 在最字面意义上,没有进化或退化。线

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

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

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

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

      您将无法致电tom.swat_fly()。如果您愿意,您需要对tom 进行类型转换(例如:(<Horse>tom).swat_fly())或将其声明为Horse 而不是Animal。但我重申:对象的属性不会更改为超类的。

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

    【讨论】:

      猜你喜欢
      • 2017-12-04
      • 1970-01-01
      • 2017-07-14
      • 1970-01-01
      • 2017-04-10
      • 2021-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多