typescript通过访问修饰符和抽象类实现结构化面向对象设计:public/protected/private/readonly控制封装与可见性,abstract class定义可继承骨架并强制子类实现抽象方法,二者协同构建职责明确、可维护的继承体系。

TypeScript 在类中通过访问修饰符和抽象类,把 JavaScript 原本松散的面向对象实践,变成可约束、可继承、可维护的结构化设计。关键不在于“加语法”,而在于用这些机制明确职责边界和扩展规则。
访问修饰符控制可见性与封装粒度
public、private、protected 和 readonly 不是装饰,而是编译期的契约,直接影响代码能否通过类型检查:
-
public:默认行为,不限制访问。可在类内、子类、实例外部任意读写(如
obj.name) - private:仅限当前类内部使用。子类和外部实例均不可见——哪怕同名属性在子类中声明,也视为全新字段,不覆盖父类私有成员
-
protected:允许当前类及其子类访问,但禁止外部实例调用。这是实现“受控继承”的基础,比如父类定义
protected init(),子类可复用但用户不能误调 - readonly:修饰后属性只能在声明时或构造函数中赋值一次,之后不可修改(注意:它不阻止对象内部属性被改,只限制引用重赋)
推荐写法:直接在构造函数参数上加修饰符,自动声明并初始化实例属性,避免冗余代码。例如:constructor(public name: string, private id: number) { }
抽象类定义可继承的骨架与强制契约
抽象类(abstract class)不是用来创建实例的,而是为一组子类提供共性结构和必须实现的接口:
- 用
abstract修饰的方法没有方法体,子类必须用override实现(否则报错) - 抽象类可以包含具体方法、属性、构造函数,也能有
protected或private成员,用于封装共享逻辑 - 不能用
new实例化抽象类,只能被继承;子类若未实现全部抽象成员,自身也会被自动标记为抽象
典型场景:定义 abstract class Shape,含抽象方法 area(): number 和具体方法 toString(),让 Circle、Rectangle 各自实现面积计算,同时复用统一的字符串格式逻辑。
Java项目代码review工具。分析Git变更+完整调用链路上下文,推断业务需求,进行多维度评分和分类汇总,生成完整PRD文档。包含细粒度Java代码审查清单(Null安全、异常处理、Streams、并发、equals/hashCode、资源管理、API设计、性能、MyBatis/ORM、事务边界、SQL/DD...
抽象类 vs 接口:分工要清晰
二者都用于约束,但定位不同:
-
接口(interface) 描述“能做什么”,纯行为契约,支持多重实现(一个类可
implements多个接口),适合定义能力组合,如Runnable、Serializable -
抽象类 描述“是什么+部分怎么做”,强调类型层级与代码复用,适合表达具有共同状态和基础行为的类族,如
Animal→Dog、Cat
实际项目中常组合使用:抽象类实现核心逻辑,再用接口声明额外能力。例如 abstract class Vehicle implements Drivable, Parkable。
配合继承与 super 构建可靠扩展链
修饰符和抽象类的价值,只有在继承体系中才真正释放:
- 子类构造函数中必须第一行调用
super(),确保父类初始化逻辑执行 - 通过
super.xxx可安全访问父类的public和protected成员(不可访问private) - 若父类构造函数含
protected或private参数,子类需显式传入或转发,否则无法完成初始化
错误示例:private 属性导致子类看似继承了字段,实则完全隔离——这是有意为之的封装,不是缺陷。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










