Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 为什么私有/受保护成员必须来自同一类以实现类型兼容性?_Javascript_Oop_Typescript - Fatal编程技术网

Javascript 为什么私有/受保护成员必须来自同一类以实现类型兼容性?

Javascript 为什么私有/受保护成员必须来自同一类以实现类型兼容性?,javascript,oop,typescript,Javascript,Oop,Typescript,在这方面,它说: 类中的私有成员和受保护成员会影响它们的兼容性。 检查类实例的兼容性时,如果 实例包含私有成员,则目标类型也必须 包含源自同一类的私有成员。 同样,这也适用于具有受保护成员的实例。 这允许类与其超类的赋值兼容, 但不适用于来自不同继承层次结构的类 否则会有相同的形状 当TypeScript中的类型兼容性是结构化的(duck类型)时: 包含受保护/私有成员的类的情况实际上是名义上的: class Animal { private feet: number; } class

在这方面,它说:

类中的私有成员和受保护成员会影响它们的兼容性。 检查类实例的兼容性时,如果 实例包含私有成员,则目标类型也必须 包含源自同一类的私有成员。 同样,这也适用于具有受保护成员的实例。 这允许类与其超类的赋值兼容, 但不适用于来自不同继承层次结构的类 否则会有相同的形状

当TypeScript中的类型兼容性是结构化的(duck类型)时:

包含受保护/私有成员的类的情况实际上是名义上的:

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);