如何在OCaml中继承属性?

时间:2015-02-24 09:47:15

标签: inheritance ocaml

真实世界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不是   真实对象,只能用于调用方法。

然后我如何从超类'属性继承?

1 个答案:

答案 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