Racket的文档仅部分描述了augment
和pubment
所做的事情:augment
创建了一个在超类的该方法版本之后执行的方法,而pubment
创建了一个方法如果在子类中定义了augment
属性,它将隐式具有该属性。
文档对overment
和augride
一无所知,我无法根据他们的名字猜测他们会做些什么。它们是什么,它们之间有什么区别?
答案 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
。
overment
和augride
怎么样?
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,它非常易读且包含一些有用的图表。