Scala中类混入Trait的规则是什么?基于《Programming In Scala》第12章
将Trait混入类中(出自《Programming In Scala》第12章)
刚好这段内容我熟,咱们来把Doubling Trait这两个特殊点讲得明明白白:
自带父类约束,不是随便什么类都能混
Doubling Trait明确声明了它的父类是IntQueue,这就相当于给它加了个严格的准入门槛:只能混入那些继承了IntQueue的类。比如你可以把它和BasicIntQueue搭配使用(因为BasicIntQueue是IntQueue的实现类),但要是想把它混进Rational类里?门都没有——毕竟Rational和IntQueue半毛钱继承关系都没有。用
with关键字实现灵活混入
虽说它有父类约束,但这不代表你的类只能死板地先继承IntQueue。你完全可以让你的类先继承任意一个符合要求的类(只要这个类最终是IntQueue的子类),然后通过with关键字把Doubling这个Trait“贴”上去,完美避开单一继承的限制。
给你补个实际代码示例,一看就懂:
// 定义基础的IntQueue特质 trait IntQueue { def put(x: Int): Unit def get(): Int } // 实现IntQueue的基础类 class BasicIntQueue extends IntQueue { private val buf = new scala.collection.mutable.ArrayBuffer[Int] def put(x: Int): Unit = buf += x def get(): Int = buf.remove(0) } // 带父类约束的Doubling特质 trait Doubling extends IntQueue { abstract override def put(x: Int): Unit = super.put(x * 2) } // 实际混入用法 val doubledQueue = new BasicIntQueue with Doubling doubledQueue.put(5) println(doubledQueue.get()) // 输出10
内容的提问来源于stack exchange,提问作者Mandroid
相关产品推荐
相关产品推荐

