[译]Scala使用Mixins进行类组合

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 C

val d = new D
d.message  // I'm an instance of class B
d.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

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容