本文概述
在Scala中, 特征混合器意味着你可以使用类或抽象类扩展任意数量的特征。你只能扩展特征或特征与类的组合或特征与抽象类的组合。
必须保持mixin的顺序, 否则编译器将引发错误。
你可以像这样在scala中使用mixins:
Scala特性示例:未维护Mixins订单
在此示例中, 我们扩展了特征和抽象类。让我们看看会发生什么。
trait Print{
def print()
}
abstract class PrintA4{
def printA4()
}
class A6 extends Print with PrintA4{
def print(){ // Trait print
println("print sheet")
}
def printA4(){ // Abstract class printA4
println("Print A4 Sheet")
}
}
object MainObject{
def main(args:Array[String]){
var a = new A6()
a.print()
a.printA4()
}
}
输出
error: class PrintA4 needs to be a trait to be mixed in
class A6 extends Print with PrintA4{
^
one error found
上面的程序抛出编译时错误, 因为我们没有保持mixins的顺序。
Scala Mixins订单
正确的mixins特性顺序是你要扩展的任何类或抽象类, 首先对其进行扩展。所有特性将在此类或抽象类之后进行扩展。
Scala特性示例:Mixins订单保持不变
trait Print{
def print()
}
abstract class PrintA4{
def printA4()
}
class A6 extends PrintA4 with Print{ // First one is abstract class second one is trait
def print(){ // Trait print
println("print sheet")
}
def printA4(){ // Abstract class printA4
println("Print A4 Sheet")
}
}
object MainObject{
def main(args:Array[String]){
var a = new A6()
a.print()
a.printA4()
}
}
输出
print sheet
Print A4 Sheet
Scala特性的另一个例子
在这里, 我们使用了另一种方法来扩展程序中的特征。通过这种方法, 我们在对象创建过程中扩展了特征。让我们来看一个例子。
trait Print{
def print()
}
abstract class PrintA4{
def printA4()
}
class A6 extends PrintA4 {
def print(){ // Trait print
println("print sheet")
}
def printA4(){ // Abstract class printA4
println("Print A4 Sheet")
}
}
object MainObject{
def main(args:Array[String]){
var a = new A6() with Print // You can also extend trait during object creation
a.print()
a.printA4()
}
}
输出
print sheet
Print A4 Sheet