Scala使用Mixins进行类组合

来源:互联网 发布:cms内容管理系统 编辑:程序博客网 时间:2024/06/10 02:34

Mixins是用于进行类组合的特征。

abstract class A {  val message: String}class B extends A {  val message = "I'm an instance of class B"}trait C extends A {  def loudMessage = message.toUpperCase()}class D extends B with Cval d = new Dd.message  // I'm an instance of class Bd.loudMessage  // I'M AN INSTANCE OF CLASS B

D类有一个父类B和一个mixin C。每个类只能有一个父类但是可以有多个mixins(分别使用关键字extendswith)。mixins和父类可能有相同的父类型。

下面是一个更有意思的示例:

abstract class AbsIterator {  type T  def hasNext: Boolean  def next: T}

上面的类有一个抽象类型T和一个标准迭代器方法。

下面,我们会实现一个具体的类(所有抽象成员ThasNextnext都会实现):

class StringIterator(s: String) extends AbsIterator {  type T = Char  private var i = 0  def hasNext = i < s.length  def next = {    val ch = s charAt i    i += 1    ch  }}

StringIterator有一个String并可用于遍历字符串(如,查看字符串是否包含特定字符)。

下面创建一个特征扩展AbsIterator

trait RichIterator extends AbsIterator {  def foreach(f: T => Unit): Unit = while (hasNext) f(next)}

因为RichIterator是一个特征,所以不需要实现AbsIterator中的抽象成员。

StringIteratorRichIterator的功能组合到一个类中。

object StringIteratorTest extends App {  class Iter extends StringIterator(args(0)) with RichIterator  val iter = new Iter  iter foreach println}

Iter的父类是StringIterator,mixin是RichIterator

单一继承无法有这样的灵活程度。

0 0
原创粉丝点击