Racket的文档仅部分描述了什么augment和pubment做什么:augment创建一个在超类的该方法版本之后执行的方法,同时pubment创建一个方法,augment如果它在子类中定义,将隐式拥有该属性.
文档完全没有说overment和augride,我无法猜测他们会根据他们的名字做什么.它们是什么,它们之间有什么区别?
Ale*_*ing 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和声明的方法pubment.override-final和augment-final他们的非最终对手做同样的事情,但防止进一步的压倒或增加.overment和augride转换重写的方法来augmentable者,反之亦然.对于另一个更全面的解释,您可能有兴趣看一下从中得出Racket模型的论文,这篇论文非常易读且包含一些有用的图表.