| RFC-0063:OrdinalRange | |
|---|---|
| 状态 | 已拒绝 |
| 区域 |
|
| 说明 | 向接口添加了可选的 [OrdinalRange] 属性。如果存在,则接口定义的序号必须在声明的范围内。 |
| 作者 | |
| 提交日期(年-月-日) | 2018-07-31 |
| 审核日期(年-月-日) | 2018-10-04 |
拒绝理由
我们多次讨论了如何让接口不断发展,并实现可继承性。
例如,在接口上引入序号,这样一来,方法序号就可以与接口序号一起唯一确定正在调用的方法。因此,我们将拒绝此[OrdinalRange]提案。
不过,我们认识到需要控制继承,因为我们目前的模式可能会带来问题:在库作者不知情的情况下,定义的接口可能会被继承,这样一来,引入新方法就会对继承者造成无法弥补的破坏。
因此,我们将暂时引入一项要求(直到我们找到更好的解决方案):任何需要继承的接口都必须使用 [FragileBase] 进行注释。
与其他 RFC 的关系
此 RFC 已被以下 RFC 取代:
摘要
为接口添加了可选的 [OrdinalRange] 属性。
如果存在,则接口定义的序号必须在声明的范围内。
除非接口声明了 [OrdinalRange],否则无法从该接口继承;并且子接口不能使用其超接口声明的范围内的任何序号。
设计初衷
在 FIDL 中,接口可以继承自其他接口。FIDL 编译器会阻止这两个接口为同一序号分配不同的语义,但没有机制可让超级接口预留序号以供将来使用。根据目前的定义,向任何接口添加序号可能会破坏继承自该接口并分配该序号的其他(未见)接口。
FIDL 样式评分标准建议通过在注释中记录预留的序号范围来解决此问题(至少对于预期会被继承的接口是这样)。此 FTP 建议将这些预留放在接口的 [OrdinalRange] 属性中。
设计
此更改仅影响 FIDL 源语言。 它不会影响有线格式或任何生成的绑定。 实现可以完全在 FIDL 前端编译器中进行。
- 为接口引入了可选的
[OrdinalRange]属性。 如果存在,此属性的值必须符合以下语法:NUMERIC-LITERAL、“-”、NUMERIC-LITERAL
- 如果存在,接口定义的所有序号都必须在指定范围内(含)。
- 除非第二个接口具有
[OrdinalRange]属性,否则一个接口无法继承自另一个接口。 - 接口的所有超接口都必须具有定义不相交范围的
[OrdinalRange]属性。 - 接口不能定义属于其任何超接口的
[OrdinalRange]的序号。
如果违反了上述任何不变量,FIDL 前端必须生成错误。
将 FIDL 样式评分标准中建议使用注释来实现此目的的段落替换为要求使用 [OrdinalRange] 属性来实现此目的的段落。
文档和示例
此功能将在 FIDL 样式评分标准中进行说明(并提供示例)。
向后兼容性
此功能不向后兼容,因为在我们将 [OrdinalRange] 属性添加到超接口之前,对继承的现有使用将无法编译。不过,我们很少使用继承,因此更新所有超接口会很容易。
性能
此提案对性能没有影响。
安全
此提案对安全性没有影响。
测试
fuchsia.io 库将提供正面的编译测试结果。
缺点、替代方案和未知因素
实现此提案的主要缺点是,在接口之间创建继承关系时需要额外的仪式。不过,这种仪式已经存在,以有关预留序号范围的注释的形式存在。
另一种方法是继续使用注释来非正式地预留序号范围。
在先技术和参考资料
我们假设其他类似系统也会执行类似操作,但并未对此进行研究。