Javascript 为什么私有/受保护成员必须来自同一类以实现类型兼容性?
在这方面,它说: 类中的私有成员和受保护成员会影响它们的兼容性。 检查类实例的兼容性时,如果 实例包含私有成员,则目标类型也必须 包含源自同一类的私有成员。 同样,这也适用于具有受保护成员的实例。 这允许类与其超类的赋值兼容, 但不适用于来自不同继承层次结构的类 否则会有相同的形状 当TypeScript中的类型兼容性是结构化的(duck类型)时: 包含受保护/私有成员的类的情况实际上是名义上的:Javascript 为什么私有/受保护成员必须来自同一类以实现类型兼容性?,javascript,oop,typescript,Javascript,Oop,Typescript,在这方面,它说: 类中的私有成员和受保护成员会影响它们的兼容性。 检查类实例的兼容性时,如果 实例包含私有成员,则目标类型也必须 包含源自同一类的私有成员。 同样,这也适用于具有受保护成员的实例。 这允许类与其超类的赋值兼容, 但不适用于来自不同继承层次结构的类 否则会有相同的形状 当TypeScript中的类型兼容性是结构化的(duck类型)时: 包含受保护/私有成员的类的情况实际上是名义上的: class Animal { private feet: number; } class
class Animal {
private feet: number;
}
class Size {
private feet: number;
}
let a: Animal = new Size; // Error!
有人能解释为什么在TypeScript中公共成员和受保护/私有成员之间存在这种不一致性吗?这是为了防止从其他类型访问私有/受保护成员 发件人: 考虑一下这样的事情
class Foo {
private versionNumber = 10;
public compareTo(other: Foo) {
return this.getVersion() === other.getVersion();
}
private getVersion() {
return this.versionNumber;
}
}
class Bar {
private myName = 'default;'
public compareTo(other: Bar) {
return this.myName === other.myName;
}
private getVersion() {
/* ... DANGEROUS CODE HERE ...*/
return -1;
}
}
通过检查,Bar#getVersion
从未被调用——它是一个私有的
方法,并且没有来自原始类的调用。那个
对于不积极尝试的代码,检查应该足够了
处理打字检查
但此代码确实调用了Bar#getVersion
:
let f = new Foo();
let b = new Bar();
f.compareTo(b);
这是为了防止从其他类型访问私有/受保护的成员 发件人: 考虑一下这样的事情
class Foo {
private versionNumber = 10;
public compareTo(other: Foo) {
return this.getVersion() === other.getVersion();
}
private getVersion() {
return this.versionNumber;
}
}
class Bar {
private myName = 'default;'
public compareTo(other: Bar) {
return this.myName === other.myName;
}
private getVersion() {
/* ... DANGEROUS CODE HERE ...*/
return -1;
}
}
通过检查,Bar#getVersion
从未被调用——它是一个私有的
方法,并且没有来自原始类的调用。那个
对于不积极尝试的代码,检查应该足够了
处理打字检查
但此代码确实调用了Bar#getVersion
:
let f = new Foo();
let b = new Bar();
f.compareTo(b);