根据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调用方法时,调用的实现将是线性化中右边的第一个实现。
根据我的理解,所有mixins和类中存在的重写方法put()将按以下顺序调用: Incrementing->倍增
如果BasicIntQueue类的方法put()在线性化中没有加倍的话,那么它是如何被调用的。
这是否意味着在调用层次结构方法之后将始终调用对象的类(ex)中的BasicInQueue方法。
答案 0 :(得分:3)
您的线性化不正确,因为您忘记考虑您在实例化obj
时创建的匿名类。你的代码相当于
class ObjClass extends BasicIntQueue with Doubling with Incrementing
val obj = new ObjClass
并且该类的线性化是
ObjClass->Incrementing->Doubling->BasicIntQueue-> IntQueue->AnyRef->Any
解决了您的问题。