RFC-0063:OrdinalRange | |
---|---|
状态 | 已拒绝 |
领域 |
|
说明 | 为接口添加可选的 [OrdinalRange] 属性。如果存在,则接口定义的序数必须在声明的范围内。 |
作者 | |
提交日期(年-月-日) | 2018-07-31 |
审核日期(年-月-日) | 2018-10-04 |
遭拒的理由
我们已经讨论了很多关于我们希望如何演变和实现接口可继承性的讨论。
例如,在接口上引入序数(与方法序数一起使用可以唯一地确定要调用的方法)。因此,我们将拒绝 [OrdinalRange]
项提案。
不过,我们认识到需要控制继承,因为我们目前采用的模式可能会出现问题:库作者不知情:定义的接口可能会继承,导致引入新方法会不可避免地破坏继承器。
因此,我们将暂时(直到我们有更好的解决方案)引入一项要求,即需要继承的任何接口都必须带有 [FragileBase]
注解。
与其他 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
库将提供正向编译测试。
缺点、替代方案和未知情况
实现此方案的主要缺点是在接口之间创建继承关系的额外仪式。 但是,这种仪式已经以关于预留序数范围的评论形式存在。
另一种方法是继续使用注释来非正式地预留序数范围。
早期技术和参考资料
我们假设其他类似系统会做类似的事情,但并没有对其进行研究。