Scala trait là một interface với các phương thức không Abstract. Một class có thể implement với nhiều trait khác nhau, và những trait này có thể được yêu cầu các phương thức Abstract được thêm vào hoặc cung cấp các phương thức cụ thể cho class đó. Chúng ta cũng có thể sử dụng trait như một type giống như cách interface hoạt động.
Scala trait bao gồm các phương thức và định nghĩa các trường có thể tái sử dụng bằng cách trộn lẫn các class. Class có thể trộn với nhiều trait một lúc. Trait được khai bao giống như cách chúng ta làm với class bằng cách sử dụng từ khoá trait.
Hãy cùng xem ví dụ sau đây về trait với phương thức chưa được implement.
import scala.io.Source trait Cardetails{ def details(d:String):String } class Cardet extends Cardetails { 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]) } }
Kết quả
Car details are being displayed true
Chúng ta định nghĩa một trait là Cardetails
mà không implement bất kỳ phương thức nào. Trong class Carder chúng ta thực hiện override lại phương thức details
và sau đó tạo object car
Tiếp theo là ví dụ về trait với phương thức được implement
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) } }
Kết quả
Alto 34 Color:Black
Chúng ta đã định nghĩa một trait detcar với phương thức readdetails
đã được implement. Trong class car chúng ta đang định nghĩa phương thức details
với cname và cno. Chúng ta khai báo class Alto extend từ class car và trait decar với thông tin bổ sung về color của car. Tiếp theo chúng ta tạo object cartest và gọi class Alto, truyền vào name, number và color và in ra thông tin về car.
Cách sử dụng trait
Khi chúng ta implement một collection tái sử dụng hoặc behavior, chúng ta phải quyết định sử dụng trait hoặc abstract class. Sau đây là một vài hướng dẫn mà có thể làm theo
- Nếu hiệu quả là tiêu chí chính thì nên sử dụng class. Trait được biên dịch thành các interface và do đó nó có thể gây ảnh hưởng đến hiệu năng
- Nếu bạn muốn kế thừa từ Java code thì tốt hơn nên sử dụng abstract class vì trait không có trong java nên sẽ hơi lạ khi kế thừa từ trait.
- Sử dụng class cụ thể nếu behavior không tái sử dụng lại
- Trait có thể được sử dụng nếu behavior được tái sử dụng trong nhiều class khác nhau