我是 Typescript 的新手,我尝试在本文中使用 TypeScript 进行一些尝试操场 http://www.typescriptlang.org/play/。我注意到在 TypeScript 中,基类中的受保护成员可以被公共成员覆盖:
class Base {
protected name: string = '!'
}
class Derived extends Base{
public name: string = '?'
}
一方面,这对我来说是有意义的,因为里氏替换原则仍然成立:基类比派生类有更严格的要求。但另一方面,我注意到私有成员不能被受保护或公共成员覆盖,这对我来说似乎不一致:
class Base {
private name: string = '!'
}
class Derived extends Base{
public name: string = '?' // ERROR!
}
因此我想知道:
我的观察是 Typescript 中的预期行为还是错误?
如果是有意为之,为什么会存在这种不一致?为什么 TypeScript 不要求所有重写成员具有与基类中的成员相同的可访问性?或者允许所有具有更高可访问性的派生成员覆盖基类中的成员?
这是预期的行为。
你可以做一个protected
field public
因为protected
允许派生类读取和写入字段。派生类可以选择使用其读写字段的能力来允许其他类读写该字段。让你写这样的东西是没有意义的:
class Foo {
protected someField;
}
class Bar extends Foo {
public get someFieldButPublic() {
return this.someField;
}
public set someFieldButPublic(value) {
this.someField = value;
}
}
如果你想做的只是someField
public.
你不能做一个private
field protected
or public
因为您没有对该字段的读取或写入访问权限。它是private
;如果基类希望你能够访问该字段,他们就会这样做protected
, 毕竟。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)