gpt4 book ai didi

inheritance - 如何继承 OCaml 中的属性?

转载 作者:行者123 更新时间:2023-12-01 23:32:35 25 4
gpt4 key购买 nike

真实世界 OCaml 书,在其 Chapter 12 中, 显示了如何继承父类(super class)的方法,例如push 方法如下:

class double_stack init = object
inherit [int] stack init as super

method push hd =
super#push (hd * 2)
end ;;

但是它提到 super 不像在 Java 中那样工作:

The preceding as super statement creates a special object called super which can be used to call superclass methods. Note that super is not a real object and can only be used to call methods.

那我该如何继承父类(super class)的属性呢?

最佳答案

您可以访问继承类的属性,就好像它们是在当前类中定义的一样,这与许多其他面向对象的语言非常相似;访问规则对应于 C++ 中的 protected 级别:您不能直接从类外部访问属性,继承类除外。

书中给出的特殊规定是说明类的方法不能返回super,因为这个符号只是访问继承方法的句法设备。当这些方法被当前类或另一个继承类覆盖时,此设备可能很有用。

class foo = object
val mutable v = "hello"
method m = v
end

访问继承的属性:

class bar = object
val w = "world"
method! m = v ^ " " ^ w
end

注意上面的bar类重写了方法m,也就是说从bar<内部访问foo的方法(在本例中,当然,这不是必需的)将要求将其限定为 super#m

非法使用父类(super class)名称:

class wrong = object(self)
inherit foo as super
method w = super (* cannot compile *)
end

Error: Ancestor names can only be used to select inherited methods

实现这种语义的正确方法是返回 self casted 作为它的父类(super class):

class correct = object(self)
inherit foo as super
method w = (self :> foo)
end

关于inheritance - 如何继承 OCaml 中的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28692501/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com