美文网首页Scala Tour
[译]Scala使用Mixins进行类组合

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

作者: steanxy | 来源:发表于2017-05-04 14:10 被阅读138次

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

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

相关文章

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

    Mixins是用于进行类组合的特征。 D类有一个父类B和一个mixin C。每个类只能有一个父类但是可以有多个mi...

  • [译]Scala类

    Scala中的类用于创建对象。类中可以包含方法,值,变量,类型,对象,特征以及类,统称为成员。类型,对象和特征稍后...

  • [译]Scala Case类

    Case类和常规类有几个关键差异。Case类适用于模型化不可变数据。之后会在模式匹配中展示如何使用Case类。 定...

  • scala07.类

    7.1简单类和无参方法 通过class进行类的定义。注:在Scala中,类并不声明为Public,一个Scala源...

  • [译]Scala泛型类

    泛型类是以一个类型作为参数的类。对于集合类特别有用。 定义泛型类 泛型类以一个类型作为参数,包含在[]中。试用字母...

  • Dart中的新特性(Mixins)

    什么是Mixins?Mixins的中文意思是混入,即在一个类中混入其他类。首先我们需要知道,Mixins不是接口,...

  • Scala学习第二节:环境安装配置

    Scala是基于java之上,大量使用java的类库和变量,使用Scala之前必须先安装。我使用的jdk1.8 ...

  • Java & Groovy & Scala & Kotlin -

    Overview 样本类是 Scala 中使用关键字 case class 声明的类。它可以隐式调用构造方法进行初...

  • Scala-13.包和导包

    Scala导入成员变量的方法: 随处可使用import 导入类,包或者对象 导入类时隐藏并且重命名它们 Scala...

  • Scala版Hello world

    下面对以上程序使用到的一些概念进行讲解。 object:把类的属性和方法从类的定义中分离 Scala没有stati...

网友评论

    本文标题:[译]Scala使用Mixins进行类组合

    本文链接:https://www.haomeiwen.com/subject/xsortxtx.html