Scala Traits示例教程
时间:2020-02-23 14:41:49 来源:igfitidea点击:
Scala特性(Traits)包括方法和字段定义,可以通过混合类重用。
该类可以混合任意数量的特征。
特性通过指定所支持方法的签名来定义对象。
特质的声明方式与类相同,不同之处在于使用了关键字trait。
例如,考虑以下没有任何方法实现的特征。
trait Cardetails{
def details(d:String):String
}
class Cardet extends Cardetails {
import scala.io.Source
override def details(source:String) = {
Source.fromString(source).mkString
}
}
object car {
def main(args:Array[String]){
val c1 = new Cardet
println(c1.details("Car details are being displayed"))
println(c1.isInstanceOf[Cardetails])
}
}
下图显示了Scala Shell中的执行和输出。
我们正在定义一个没有任何方法实现的特征'Cardetails'。
在Cardet类中,我们将覆盖方法的详细信息,然后创建一个对象车。
考虑一个带有方法实现的特征的例子。
import scala.io.Source
trait detcar{
def readdetails(d:String):String =
Source.fromString(d).mkString
}
class Car(var cname:String, var cno:Int){
def details = cname+" "+cno
}
class Alto( cname:String, cno:Int,var color:String) extends Car(cname,cno) with detcar{
override def details = {
val det = readdetails(color)
cname+"\n"+cno+"\n"+"Color:"+color
}
}
object cartest {
def main(args:Array[String]){
val a1 = new Alto("Alto",34,"Black")
println(a1.details)
}
}
下面是执行main方法时产生的输出。
scala> cartest.main(null) Alto 34 Color:Black
我们正在使用具有实现方式的" readdetails"方法定义特征卡片。
在类车中,我们使用cname和cno定义"详细信息"。
我们声明了Alto类,该类扩展了汽车类并使用有关汽车颜色的附加信息实施特征卡。
我们正在创建cartest对象,并调用Alto类,传递名称和颜色,并打印详细信息。
性状的运用
在实现可重用的集合或者行为时,我们必须在特征和抽象类之间做出决定。
可以遵循一些准则。
如果效率是关键标准,那么建议使用类。
特性被编译到接口,因此可能会付出一些性能开销。如果您需要从Java代码继承,那么最好使用抽象类,因为特征没有Java模拟,因此从特征继承会很奇怪。
如果该行为不可重用,则建议使用具体类。
如果行为在多个不相关的类中重用,则可以使用特质。

