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模拟,因此从特征继承会很奇怪。

  • 如果该行为不可重用,则建议使用具体类。

  • 如果行为在多个不相关的类中重用,则可以使用特质。