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

Thr*_*unt 7 oop class racket

Racket的文档仅部分描述了什么augmentpubment做什么:augment创建一个在超类的该方法版本之后执行的方法,同时pubment创建一个方法,augment如果它在子类中定义,将隐式拥有该属性.

文档完全没有说overmentaugride,我无法猜测他们会根据他们的名字做什么.它们是什么,它们之间有什么区别?

Ale*_*ing 10

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

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

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

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

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

那么,怎么样这两个怪异的混合动力汽车,overmentaugride

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

总结一下:

  • public,pubmentpublic-final所有声明超类中不存在的方法.
  • 然后我们有一系列用于扩展超类方法的表单:
    • override并使用相关行为分别augment扩展用public和声明的方法pubment.
    • override-finalaugment-final他们的非最终对手做同样的事情,但防止进一步的压倒或增加.
    • overmentaugride转换重写的方法来augmentable者,反之亦然.

对于另一个更全面的解释,您可能有兴趣看一下从中得出Racket模型的论文,这篇论文非常易读且包含一些有用的图表.