Scala使用Mixins进行类组合

xiaoxiao2021-02-27  284

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(分别使用关键字extends和with)。mixins和父类可能有相同的父类型。

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

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

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

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

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中的抽象成员。

将StringIterator和RichIterator的功能组合到一个类中。

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

类Iter的父类是StringIterator,mixin是RichIterator。

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

转载请注明原文地址: https://www.6miu.com/read-3580.html

最新回复(0)