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
库将提供有效的编译测试。
缺点、替代方案和未知情况
实现此提案的主要缺点是,需要额外的步骤来在接口之间创建继承关系。不过,这种仪式已经以关于预留序数范围的注释的形式存在。
另一种方法是继续使用注释以非正式方式预留序数范围。
在先技术和参考文档
我们假定其他类似系统也会执行类似操作,但尚未对此进行研究。