本文主要是介绍Scala之旅-混合组成的类(CLASS COMPOSITION WITH MIXINS),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Mixins 就是用于组成类的 traits。
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
println(d.message) // I'm an instance of class B
println(d.loudMessage) // I'M AN INSTANCE OF CLASS B
类 D
有一个父类 B
和一个 mixin C
。类只能拥有一个父类但是可以拥有多个 mixin (分别使用关键字 extends
和 with
)。mixin 和类可以拥有相同的父类。
现在让我们来看一个更有趣的例子,新建一个抽象类。
abstract class AbsIterator {type Tdef hasNext: Booleandef next(): T
}
该类中有一个抽象类型 T
和标准的迭代器方法。
接下来,我们将实现一个具体的类(实现抽象类中全部的成员,包括抽象类型 T
, hashNext
和 next
方法)
class StringIterator(s: String) extends AbsIterator {type T = Charprivate var i = 0def hasNext = i < s.lengthdef next() = {val ch = s charAt ii += 1ch}
}
StringIterator
实现类带有一个 String
类型参数的构造器,可用于对字符串进行迭代。(比如查看字符串中是否包含某个字符)
现在建立一个也继承 AbsIterator
的 trait。
trait RichIterator extends AbsIterator {def foreach(f: T => Unit): Unit = while (hasNext) f(next())
}
只要有更多的元素,该 trait 就会循环调用在下一个元素 (next()
) 上的函数 f: T = > Unit
来实现 foreach
。
因为 RichIterator
是一个 trait,所以它不需要实现 AbsIterator
中的抽象成员属性或方法。
下面我们把 StringIterator
和 RichIterator
中的功能组合成单个类。
object StringIteratorTest extends App {class RichStringIter extends StringIterator("Scala") with RichIteratorval richStringIter = new RichStringIterrichStringIter foreach println
}
新类 RichStringIter
有一个 StringIterator
父类和 RichIterator
作为 mixin。
如果是单一继承,我们将无法达到这样的灵活性。
这篇关于Scala之旅-混合组成的类(CLASS COMPOSITION WITH MIXINS)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!