在 Scala 中使用 Mixin 有什么好处?
What are the benefits of Mixin in Scala?
我正在阅读 Scala Blog for Mixin,但我没有看到他们在 post 上使用的代码的优势。首先,他们只在 main 方法中使用 traits 方法,所以我不明白为什么他们不能扩展 trait:
object StringIteratorTest {
def main(args: Array[String]) {
class Iter extends StringIterator(args(0)) with RichIterator
val iter = new Iter
iter foreach println
}
}
我已经用下面的代码试过了,只要扩展特征就可以让我访问特征的和抽象的 class' 方法。所以我的问题是:使用特征有什么好处?
object Mixin extends App {
class MixinTrait extends MixinAbstractClass{
def traitPrint = println("I'm the trait")
}
abstract class MixinAbstractClass {
def abstractPrint = println("I'm the abstract classs")
}
class MixinImplementation extends MixinTrait {}
val obj = new MixinImplementation()
obj.traitPrint
obj.abstractPrint
}
假设StringIterator
是独立实现的。也许,它是某个库的成员,你想通过添加一些实用方法来 "enrich" 它。
你不能让 StringIterator
出于这个原因扩展你的特征,它对你来说是不可修改的(另一种常见情况是你不希望 class 像那样直接扩展特征是指您添加的功能仅对 class 的某些应用程序有用,而对其他应用程序没有用)。
您可以反过来做,并使 "rich" 特征扩展原始 class,就像您在示例中所做的那样。这行得通,但如果有多个呢? StringIterator
、IntIterator
、FileIterator
、MyIterator
、YourIterator
...那你会扩展哪一个?
我正在阅读 Scala Blog for Mixin,但我没有看到他们在 post 上使用的代码的优势。首先,他们只在 main 方法中使用 traits 方法,所以我不明白为什么他们不能扩展 trait:
object StringIteratorTest {
def main(args: Array[String]) {
class Iter extends StringIterator(args(0)) with RichIterator
val iter = new Iter
iter foreach println
}
}
我已经用下面的代码试过了,只要扩展特征就可以让我访问特征的和抽象的 class' 方法。所以我的问题是:使用特征有什么好处?
object Mixin extends App {
class MixinTrait extends MixinAbstractClass{
def traitPrint = println("I'm the trait")
}
abstract class MixinAbstractClass {
def abstractPrint = println("I'm the abstract classs")
}
class MixinImplementation extends MixinTrait {}
val obj = new MixinImplementation()
obj.traitPrint
obj.abstractPrint
}
假设StringIterator
是独立实现的。也许,它是某个库的成员,你想通过添加一些实用方法来 "enrich" 它。
你不能让 StringIterator
出于这个原因扩展你的特征,它对你来说是不可修改的(另一种常见情况是你不希望 class 像那样直接扩展特征是指您添加的功能仅对 class 的某些应用程序有用,而对其他应用程序没有用)。
您可以反过来做,并使 "rich" 特征扩展原始 class,就像您在示例中所做的那样。这行得通,但如果有多个呢? StringIterator
、IntIterator
、FileIterator
、MyIterator
、YourIterator
...那你会扩展哪一个?