English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Scala Trait(特征) 相当于 Java 的接口,实际上它比接口还功能强大。
与接口不同的是,它还可以定义属性和方法的实现。
一般情况下Scala的类只能够继承单一父类,但是如果是 Trait(特征) 的话就可以继承多个,从结果来看就是实现了多重继承。
Trait(特征) 定义的方式与类类似,但它使用的关键字是 trait,如下所示:
trait Equal { def isEqual(x: Any): Boolean def isNotEqual(x: Any): Boolean = !isEqual(x) }
以上Trait(特征)由两个方法组成:isEqual 和 isNotEqual。isEqual 方法没有定义方法的实现,isNotEqual定义了方法的实现。子类继承特征可以实现未被实现的方法。所以其实 Scala Trait(特征)更像 Java 的抽象类。
以下演示了特征的完整示例:
/* 文件名:Test.scala * author:基础教程网 * url:ko.oldtoolbag.com */ trait Equal { def isEqual(x: Any): Boolean def isNotEqual(x: Any): Boolean = !isEqual(x) } class Point(xc: Int, yc: Int) extends Equal { var x: Int = xc var y: Int = yc def isEqual(obj: Any) { obj.isInstanceOf[Point] && obj.asInstanceOf[Point].x == x } object Test { def main(args: Array[String]) { val p1 = new Point(2, 3) val p2 = new Point(2, 4) val p3 = new Point(3, 3) println(p1.isNotEqual(p2)) println(p1.isNotEqual(p3)) println(p1.isNotEqual(2)) } }
위 코드를 실행하면, 출력 결과는 다음과 같습니다:
$ scalac Test.scala $ scala Test false true true
트레이트도 생성자를 가질 수 있습니다. 이 생성자는 필드의 초기화와 트레이트 본체 내의 문장으로 구성됩니다. 이 문장들은 특정 트레이트를 혼입한 모든 객체가 생성될 때마다 실행됩니다.
생성자의 실행 순서:
상위 클래스 생성자를 호출합니다;
트레이트 생성자는 상위 클래스 생성자 이후, 클래스 생성자 이전에 실행됩니다;
트레이트는 왼쪽에서 오른쪽으로 생성됩니다;
각 트레이트에서, 부모 트레이트는 먼저 생성됩니다;
여러 트레이트가 공통된 부모 트레이트를 가지고 있다면, 부모 트레이트는 중복 생성되지 않습니다.
모든 트레이트가 생성되고, 서브 클래스가 생성됩니다.
생성자의 순서는 클래스의 선형화의 반대입니다. 선형화는 특정 타입의 모든 상위 타입을 설명하는 기술적 규격입니다.