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
程式庫會提供正面編譯測試。
缺點、替代方案和未知事項
實作這項提案的主要缺點,是需要額外的儀式來建立介面之間的繼承關係。不過,該儀式已以保留序數範圍的註解形式存在。
另一種做法是繼續使用註解,以非正式方式保留序數範圍。
既有技術與參考資料
我們假設其他類似系統也會執行類似的操作,但尚未進行相關研究。