Lif*_*ang 2 javascript oop inheritance class typescript
我是Typescript的新手,我试着在这个操场上玩TypeScript .我注意到在TypeScript中,基类中的受保护成员可以被公共成员覆盖:
class Base {
protected name: string = '!'
}
class Derived extends Base{
public name: string = '?'
}
Run Code Online (Sandbox Code Playgroud)
一方面,这对我来说很有意义,因为Liskov替换原则仍然存在:基类比派生类有更严格的要求.但另一方面,我注意到私人成员不能被受保护或公开成员覆盖,这似乎与我不一致:
class Base {
private name: string = '!'
}
class Derived extends Base{
public name: string = '?' // ERROR!
}
Run Code Online (Sandbox Code Playgroud)
因此我想知道:
我的观察是针对打字稿的预期行为还是错误?
如果是这样的话,为什么存在这种不一致?为什么TypeScript要求所有覆盖成员具有与基类成员相同的可访问性?或者允许所有具有更高可访问性的派生成员覆盖基类中的成员?
这是预期的行为.
您可以创建一个protected字段,public因为protected允许派生类读取和写入字段.派生类可以选择使用其读取和写入字段的能力,以允许其他人读取和写入字段.没有必要让你写下这样的东西:
class Foo {
protected someField;
}
class Bar extends Foo {
public get someFieldButPublic() {
return this.someField;
}
public set someFieldButPublic(value) {
this.someField = value;
}
}
Run Code Online (Sandbox Code Playgroud)
如果你想做的就是someField公开.
你不能让一个private领域protected或者public是因为你没有读或写访问到该字段.是的private; 如果基类希望你有权访问该字段,那么他们protected毕竟会成功.