我面临一个问题,研究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