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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值