【问题标题】:Stackable Modifications in ScalaScala 中的可堆叠修改
【发布时间】:2015-01-04 07:58:22
【问题描述】:

根据《Scala 编程》一书: 如果有以下类层次结构:

abstract class IntQueue
Class BasicIntQueue extends IntQueue
trait Doubling extends IntQueue
trait Incrementing extends IntQueue
trait Filtering extends IntQueue

对象

val obj=new BasicIntQueue with Doubling with Incrementing

线性化是

BasicIntQueue->Incrementing->Doubling->IntQueue->AnyRef->Any

但根据书: 当这些类和特征中的任何一个通过 super 调用方法时,调用的实现将是线性化中其右侧的第一个实现。

因此,根据我的理解,所有 mixin 和类中存在的覆盖方法 put() 将按以下顺序调用: 递增->加倍

当BasicIntQueue类的put()方法不在Doubling in linearization的右边时,它是如何被调用的。

这是否意味着对象的类(ex 中的BasicInQueue)的方法总是在调用层次结构方法之后被调用。

【问题讨论】:

    标签: scala mixins traits


    【解决方案1】:

    您的线性化不正确,因为您忘记考虑您在实例化obj 的位置创建的匿名类。你的代码相当于

    class ObjClass extends BasicIntQueue with Doubling with Incrementing
    val obj = new ObjClass
    

    并且该类的线性化是

    ObjClass->Incrementing->Doubling->BasicIntQueue-> IntQueue->AnyRef->Any
    

    解决了你的问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 2020-12-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多