TypeScript中的private
和protected
变量有什么区别? C#
存在类似的问题,但我不确定两种语言中的概念是否相同。如果没有,了解差异会很有用。
答案 0 :(得分:33)
与其他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;
}
}
请注意,在课程A
中,您可以访问(私人)this.x
和(受保护)this.y
。
但是在课程B
中,只有this.y
和this.x
的访问权才会出现此错误:
财产' x'是私人的,只能在A级进行访问
(您可以在playground)
中看到错误理解的重要之处在于,这只适用于打字稿 在javascript中,任何引用该实例的人都可以访问这些成员。
答案 1 :(得分:7)
protected
在TypeScript中的工作方式与C#的工作方式非常相似。 TypeScript release notes文件如下:
类中新的protected修饰符的工作方式与熟悉的C ++,C#和Java语言类似。类的受保护成员仅在声明它的类的子类内可见
private
只允许您访问直接类类型。私有成员对子类不可见。
答案 2 :(得分:6)
私人 方法 :
如果某个成员被标记为私有,则无法从中访问该成员 在其包含的类之外。
受保护 方法 :
受保护的修饰符与私有修饰符非常相似 声明受保护的成员也可以 在派生类中访问。
关于 one more
的 Protected variables
点需要添加:
当基类变量受保护时,我们无法直接使用派生类中的变量。
例如:
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类的外部使用变量 name ,我们仍然可以使用它 在梅赛德斯的实例方法中,因为梅赛德斯来自 车。