真实世界OCaml书籍Chapter 12,展示了如何从超类'方法继承,例如:下面的方法push
:
class double_stack init = object
inherit [int] stack init as super
method push hd =
super#push (hd * 2)
end ;;
但后来它提到super
在Java中不起作用:
前面的
as super
语句创建了一个名为super
的特殊对象 它可以用来调用超类方法。请注意,super
不是 真实对象,只能用于调用方法。
然后我如何从超类'属性继承?
答案 0 :(得分:4)
您可以访问继承类的属性,就像它们是在当前类中定义的一样,非常类似于许多其他面向对象的语言;访问规则对应于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
,这意味着从foo
内访问bar
的方法(在此示例中,当然,这是没有必要)要求将其限定为super#m
。
非法使用超类名称:
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 作为其超类返回:
class correct = object(self)
inherit foo as super
method w = (self :> foo)
end