您的位置:首页 > 大数据 > 人工智能

scala 开发入门(6) -- trait

2018-03-12 08:52 387 查看
trait中文译为特质,在使用时通过extends 或 with 关键字来混入定义的 trait。trait与类继承最大的不同在于一个类只有一个父类但可以混入对个trait。//使用trait 关键字定义一个名为 Closable 的特质
trait Closable{
def close():Unit
}假设现在有一个文件类File,它需要实现自己的close 方法以便关闭文件,此时可以通过关键字extends将Closable trait混入,并对 close 方法进行实现class File(var name:String) extends Closable{
def close():Unit = println(s"Fine $name has been closed") //没有用 override 重写
}

//混入多个trait 用 extends ... with
trait Processable extends Closable with Cloneabletrait 的用法object Example extends App{
case class Person(var id:Int,var name:String,var age:Int) //样例类
//定义只包含抽象方法的 trait,当然也可以定义具体的变量和方法
trait PersonDAO{
def add(p:Person)
def update(p:Person)
def delete(id:Int)
def findById(id:Int):Person
}

class PersonDAOImpl extends PersonDAO{
//添加方法
override def add(p:Person):Uint = {
println("Invoking add Method .... adding " + p)
}
...
}
val p:PersonDAO = new PersonDAOImpl
p.add(Person(1,"John",18))
}提前定义与懒加载//提前定义就是在创建对象的过程中提前定义好构造函数中出现的变量
val s = new {override val filename = "file.log"} with Student

//如果觉得提前定义的方式代码不够优雅,推荐使用懒加载
object Example extends App{
import java.io.PrintWriter
trait Logger{
def log(msg:String):Unit}
trait FileLogger extends Logger{
val fileName:String
//懒加载定义为 lazy
lazy val fileOutput = new PrintWrite(filename:String)
def log(msg:String):Unit = {fileOutput.print(msg)
fileOutput.flush()
}
}
class Student extends FileLogger{
val filename = "file.log"
}
val s = new Student
s.log("lazy demo")
}trait 与 类 的区别:
1.类可以在定义时使用主构造函数定义类的成员变量,而 trait 不能
   class Logger(val msg:String) 可以
   trait  Logger(val msg:String) 错误

2.类只能有一个父类,但trait 可以混入多个trait
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  scala trait