在Racket的课堂系统中,增强,覆盖,增强等有什么作用?

时间:2015-03-31 22:34:47

标签: class oop racket

Racket的文档仅部分描述了augmentpubment所做的事情:augment创建了一个在超类的该方法版本之后执行的方法,而pubment创建了一个方法如果在子类中定义了augment属性,它将隐式具有该属性。

文档对overmentaugride一无所知,我无法根据他们的名字猜测他们会做些什么。它们是什么,它们之间有什么区别?

1 个答案:

答案 0 :(得分:10)

正如你所描述的那样,对于Racket类系统来说,相对较大的继承函数系列有点令人困惑,而且它们有点可爱的名字并不总是有用。

为了理解这一点,Racket提供了两种独立的方法继承机制。

  • public 方法对应于其他OO模型中公共方法的经典概念。使用public声明的方法可以在子类中重写,除非它们被声明为 final ,在这种情况下它们不能。
  • pubment 方法类似,但不能重写,只能扩充。扩充方法类似于覆盖它,但是dispatch调用超类的实现而不是子类的。

为了阐明重写和扩充之间的区别,当调用重写方法时,执行重写实现,可以可选地通过inherit/super调用超类的实现。相反,在增强方法中,超类的实现接收控制,并且可以选择通过inner调用子类的实现。

现在,我们还提供了 public-final override-final augment-final 。这些非常简单。使用public-final声明方法意味着它既不能被扩充也不能被覆盖。使用override-final会覆盖超类的公共方法,但它不允许任何进一步覆盖。最后,augment-final类似,但对于使用pubment声明的方法,而不是public

那么,两个奇怪的混合体overmentaugride怎么样?

  • overment 可用于实现最初定义的方法 public。这会将它们“转换”为可扩充的方法,而不是所有类的子类的可覆盖方法。
  • augride 走向相反的方向。它将可扩充方法转换为可覆盖方法,但覆盖实现仅替换扩充,而不是原始实现。

总结:

  • public pubment public-final 所有声明超类中不存在的方法。
  • 然后我们有一系列用于扩展超类方法的表单:
    • override augment 扩展使用 public {{声明的方法1}} ,分别使用相关行为。
    • pubment override-final 执行与非最终版本相同的操作,但会阻止进一步覆盖或扩充。
    • augment-final overment 将可覆盖的方法转换为可扩充的方法,反之亦然。

对于另一个更全面的解释,您可能有兴趣看一下the paper from which Racket's model was derived,它非常易读且包含一些有用的图表。