docs: 补充多层继承支持说明(已实测三层继承 + 中间层无宏跳过)
- §3.3 多层继承:库沿 superClass 链逐层调用每层 exportJsonFields, 每层各导各的,中间层无宏自动跳过继续向上 - 实测:三层标宏 → 爷父字段均导出;中间层无宏 → 跳过仍导出祖父字段 - 与 soulsoft super 调用链的区别:本方案靠库侧遍历,宏生成更简单 - 测试计划补充中间层无宏用例
This commit is contained in:
+26
-2
@@ -281,7 +281,30 @@ open class BaseUser {
|
||||
}
|
||||
```
|
||||
|
||||
### 3.3 宏包的编译方式
|
||||
### 3.3 多层继承(已实测验证)
|
||||
|
||||
库沿 `superClass` 链**逐层**调用每层的 `exportJsonFields`(见 §4),因此任意层数的继承都支持:
|
||||
|
||||
```
|
||||
GrandParent(标宏)→ Parent(标宏)→ Child(不标宏)
|
||||
│ │ │
|
||||
└─ exportJsonFields └─ exportJsonFields └─ 主反射流程
|
||||
导出 _gp 导出 _p 导出 _c
|
||||
```
|
||||
|
||||
**实测结果(cjc 1.1.3,inherit_3level 探针)**:
|
||||
|
||||
| 场景 | 结果 |
|
||||
|---|---|
|
||||
| 三层都标宏 | `_gp` + `_p` 均正确导出(`size=2`),子类自身 `_c` 由主反射流程处理 |
|
||||
| 中间层不标宏 | 跳过该层继续向上,`_gp` 仍导出(`size=1`),`_p` 不导出 |
|
||||
|
||||
规则:
|
||||
- **每层各导各的**:宏只解析「本类声明」里的字段,父类字段由上层自己的宏负责——不需要在子类方法里递归调用父类方法(这点与 soulsoft 的 `super.serializeObject()` 链不同,本方案靠库侧遍历,宏生成更简单);
|
||||
- **中间层无宏自动跳过**:`getStaticFunction` 抛异常即视为无宏,静默继续向祖父层查找;
|
||||
- **注意**:若中间层(如 Parent)没标宏,它的字段 `_p` 不会被导出——要导出哪层的字段,哪层就标宏,语义清晰。
|
||||
|
||||
### 3.4 宏包的编译方式
|
||||
|
||||
Cangjie 宏需要两步编译(`cjc --compile-macro` 先编宏,再编使用宏的代码)。cjpm 对宏的支持:
|
||||
|
||||
@@ -290,7 +313,7 @@ Cangjie 宏需要两步编译(`cjc --compile-macro` 先编宏,再编使用
|
||||
|
||||
> ⚠️ 待验证项:cjpm 对同包宏的编译顺序支持(见 §7 风险)。
|
||||
|
||||
### 3.4 宏需要处理的细节
|
||||
### 3.5 宏需要处理的细节
|
||||
|
||||
| 细节 | 处理 |
|
||||
|---|---|
|
||||
@@ -454,6 +477,7 @@ main() {
|
||||
| 父类字段序列化 | 输出包含 `_id`/`_createdAt`,且 `@JsonIgnore` 父类字段不输出 |
|
||||
| 父类字段反序列化 | `Deserialize<User>` 后父类字段值正确 |
|
||||
| 多层继承 | GrandParent → Parent → Child 三层字段全部输出 |
|
||||
| 中间层无宏 | 三层链中 Parent 不标宏:`_gp` 仍导出,`_p` 不导出(逐层跳过) |
|
||||
| 无宏的类 | 行为与现状完全一致(回归) |
|
||||
| 子类字段与父类字段重名 | 子类优先(输出一份,值取子类的) |
|
||||
| 父类嵌套对象字段 | 父类字段值是对象时正确递归 |
|
||||
|
||||
Reference in New Issue
Block a user