TypeScript中访问修饰符对方法重写是否有作用?
TypeScript继承中成员重写的规则解析
首先纠正一个错误认知:你从ChatGPT和Bard看到的“派生类声明属性或方法时带访问修饰符才是重写,不带就是新增同名成员”的说法不准确,TypeScript里的重写逻辑和Java/C++有区别,核心判定依据不是访问修饰符,而是成员名称、签名以及override关键字的显式声明。
核心规则说明
- 默认同名即重写(但不推荐):如果派生类声明了和基类同名的方法/属性,即使不加访问修饰符和
override,TS默认会视为重写,但如果开启了noImplicitOverride等严格编译选项,编译器会抛出警告,提示你显式声明override来明确意图。 override关键字的作用:这个关键字是显式告诉编译器“我就是要重写基类的这个成员”,此时不管有没有写访问修饰符,都会被判定为重写,同时编译器会自动检查基类是否存在对应的成员(比如名称、参数是否匹配),避免你拼写错误或者误写了一个不存在的基类成员。- 访问修饰符的角色:重写时可以修改访问修饰符,但要遵循访问级别规则:不能从更严格的级别放宽(比如基类是
private的成员无法被重写,因为派生类根本访问不到;基类protected的成员可以重写为public,但public不能改成protected或private)。如果重写时不写访问修饰符,默认会继承基类成员的访问修饰符。
结合你的代码分析
你的代码里:
Cricket类的hashSecretValue方法用了override关键字,虽然没显式加访问修饰符,但编译器会自动继承基类该方法的public访问级别,同时因为override的声明,明确这是重写操作,完全符合TS的重写规则,所以运行正常。- 注意你在
Cricket构造函数里写的public numPlayers: number,这其实不是重写,而是隐藏了基类的protected numPlayers成员。因为TS中属性的重写要求更严格,通常需要属性的类型兼容且通过override声明,这里你用public重新声明同名属性,相当于在派生类里创建了一个新的公共属性,和基类的protected成员是两个不同的变量,这点和方法重写的逻辑不一样,需要注意。
内容的提问来源于stack exchange,提问作者naruto
相关产品推荐
相关产品推荐

