如何在OCaml中继承属性?

3

《Real World OCaml》一书,在其第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个回答

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,这意味着从 bar 中访问 foo 的方法(在这个例子中,当然不必要)需要将其限定为 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强制转换为其超类并返回:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接