提问者:小点点

TypeScript-私有变量和受保护变量之间的区别


TypeScript中的privateprotected变量之间有什么区别?对于C 35;也存在类似的问题,但我不确定这两种语言中的概念是否相同。如果没有,了解这些差异将是有益的。


共3个答案

匿名用户

这与其他OO语言中的情况相同
只能从类内部访问私有方法/成员
受保护的方法/成员可以从类内部和扩展类中访问。

class A {
    private x: number;
    protected y: number;

    constructor(x: number, y: number) {
        this.x = x;
        this.y = y;
    }

    getX(): number {
        return this.x;
    }

    getY(): number {
        return this.y;
    }
}

class B extends A {
    multiply(): number {
        return this.x * this.y;
    }
}

请注意,在classA中,可以同时访问(private)这两个属性。x和(受保护的)这个。y
但是在B类中,只有可以访问这个。y这个。x出现以下错误:

属性'x'是私有的,只能在类A中访问

(你可以在操场上看到错误)

但重要的是要理解,这只适用于typescript
在javascript中,任何引用该实例的人都可以访问这些成员。

匿名用户

私人方法:

当成员被标记为私有时,不能从其包含类之外访问它。

保护方法:

受保护修饰符的作用与私有修饰符非常相似,只是声明为受保护的成员也可以在派生类中访问。

关于受保护的变量,还有一个点要添加:

当基类变量受到保护时,我们不能直接从派生类使用它的变量。

例如:

class Car{
    protected name: string;
    constructor(name: string) { this.name = name; }
}

class Mercedes extends Car{
    private noOfWheels: number;

    constructor(name: string, noOfWheels: number) {
        super(name);
        this.noOfWheels= noOfWheels;
    }

    public getIntro() {
        return `Hello, This is my ${this.name} and I have ${this.noOfWheels} wheels.`;
    }
}

let myCar= new Mercedes ("COOL Car", 4);
console.log(myCar.getIntro());  //Hello, This is my COOL Car and I have 4 wheels.
console.log(myCar.name); // Error!! , Property 'name' is protected and only accessible within class 'Car' and its subclasses.

我们不能直接从Car类外部使用变量名,我们仍然可以从Mercedes的实例方法内部使用它,因为Mercedes源于Car。

匿名用户

protected在TypeScript中的工作方式与在C#中的工作方式非常相似。TypeScript发行版将其记录为:

类中新的受保护修饰符的工作方式与熟悉的语言(如C、C#和Java)中的一样。类的受保护成员仅在声明它的类的子类中可见

private只允许您访问即时类类型。私有成员对子类不可见。

相关问题