我面臨一個問題,研究OCaml文檔並沒有使我找到一個令人滿意的解決方案。OCaml封裝
下面的代碼片段說明我的問題:
class A = object (self)
(* this should not be overwrittable in subclass B, but callable
on objects of type B!
*)
method dangerous_one input =
(do dangerous stuff...)
let safe_output = safe_dangerous_one input in
(... more dangerous things done with safe_output ...)
(* This is safe, should be overwrittable and callable in subclass *)
method safe_dangerous_one input = (...)
end
class B = object(self) inherit A as super
method! safe_dangerous_one input = (* subclass behaviour ... *)
end
綜上所述片斷:A類是基類的子類B. 它有一個危險的方法,它是複雜的,有一些陰暗的角落我不不希望客戶端代碼必須處理。事實上,我想禁止覆蓋方法「dangerous_one」的子類。
相反,它們應該覆蓋函數「safe_dangerous_one」。
此外,應該是可能的,其中「B:B」來稱呼「B#dangerous_one」作爲類B.指定一個使用「safe_dangerous」 - 零件的(新的)定義
出現我的兩難如果我只是簡單地將方法「dangerous_one」設置爲private,那麼沒有任何東西讓B類中的客戶端代碼覆蓋它,甚至可能會公開它。
如果我將其實現從簽名中隱藏起來,它不能再被覆蓋,但我不能再調用「b#dangerous_one」 - 代碼也無法被調用。
有什麼辦法可以實現我的目標嗎?
最佳, Nablezen
「你可以,你只需要把它變成私人的,你不能隱藏公共方法」 嗯,是的,我覺得我的意思是我必須把它變成私人的,當它是私人的時候,方法不可能是再次呼籲對象..例如「b#unsafe_dangerous」將不起作用,因爲現在不安全的方法是私人的。 – Nablezen
當然,然後將其設爲私人並以其他名稱重新發布,正如我在第二個示例中所建議的那樣。 – ivg