Scala中的可堆叠修改

时间:2015-01-04 07:58:23

标签: scala mixins traits

根据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方法。

1 个答案:

答案 0 :(得分:3)

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

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

并且该类的线性化是

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

解决了您的问题。