引用父类对象的子类变量

过度交换

以下是使用TypeScript的语法,

interface Animal{
    eat():void;
    sleep():void;
}

class Mammal implements Animal{

    constructor(private name:string){
        console.log(this.name, "is alive");
    }

    eat(){
        console.log("Like a mammal");
    }

    sleep(){
        console.log("Like a mammal");
    }
}

class Dog extends Mammal{
    eat(){
        console.log("Like a dog")
    }
}

let m: Mammal = new Dog("Prisca"); // looks fine
let d: Dog = new Mammal("abomination"); // This also works

对于variable d,TypeScript支持结构化类型,类型Dog具有至少属性(相似)Mammal,在覆盖后具有。因此,类型中再添加一个属性之前,变量d仍然可以指向Mammal类型对象Dog

在TypeScript中,如何避免此类陷阱?

奥斯卡·帕斯(Oscar Paz)

无法避免。TypeScript中需要结构化类型来实现与JavaScript和JSON的互操作性。这是我们必须付出的一点代价,也是TypeScript目的的结果,即在仍与JavaScript尤其是与现有代码库完全兼容的同时向JavaScript添加类型。

避免它的唯一方法,在你的榜样,是添加的东西DogMammal没有的,或者,也许,做Mammal一个抽象类,所以不能被直接实例化。在这种情况下,这将是合乎逻辑的,因为你可以创建一个新的DogCatHorse...但不只是一个新的Mammal

正如Titian和Estus所指出的那样,如果您不想Mammal抽象,并且不想真正地添加任何额外的东西,而想通过区分类的方式,一个简单的选择就是添加一个无关的私有属性。在运行时几乎没有任何影响:

private isDog: undefined;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

父引用访问Parents变量上的子类对象

子类对象未迅速显示父类变量

无法使用子类的对象访问父类的全局变量

为什么不能引用子类对象引用父类对象?

对超类对象的子类引用

在Java中如何引用子类变量而不在父类中声明该变量?

如何通过子类外部的子引用访问与子变量同名的父类变量?

python子类访问父类的类变量

Python父类访问子类的类变量

超类引用变量的子类对象访问子类的属性,而不是超级的的

我可以通过对父类的引用来访问子类的成员变量吗?

尽管子类对象调用该方法,为什么“ this”仍引用父类?

子类属性指向来自父类的相同对象引用

访问父类中的子类变量

通过抽象类类型变量还是子类类型变量引用子对象?

子类Python内的父类对象

子类与父类对象之间的区别?

从子类的ModelForm创建父类对象

检查哪个子类是父类对象

使用父类实例创建子类对象

创建新的子类对象时,在父类中定义的麻烦设置变量

通过超类变量引用子类?

如何获取子类对象的引用类

为什么动态方法分派和超类变量可以引用子类对象?

对子类对象的超类引用显示与对子类对象的子类引用相同的行为

如何通过使用父类的引用访问子类的成员?

C#:如何使用对父类的引用访问子类?

Scala - 在父类中引用子类(泛型)

将子类对象分配给父类的对象