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模拟,因此从特征继承会很奇怪。
如果该行为不可重用,则建议使用具体类。
如果行为在多个不相关的类中重用,则可以使用特质。