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:ar.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 خطأ صحيح صحيح
يمكن أن تكون الصفات أيضًا لها محركات، مكونة من تعيين الحقول وعبور الصفات الأخرى. يتم تنفيذ هذه التعليمات عند بناء أي عنصر يتم تعيينه لهذه الصفة.
ترتيب تنفيذ المحركات:
يُطلق محرك الفئة الفرعية;
يُنفيذ بناء محركات الصفات بعد بناء محركات الفئات الفرعية قبل بناء محركات الفئات;
تُبنى الصفات من اليسار إلى اليمين;
في كل صفة، يتم بناء الصفة الأم أولاً;
إذا كانت عدة صفات تتشارك الصفة الأم، فإن الصفة الأم لن تُبنى مرة أخرى.
تم بناء جميع الصفات، تم بناء الفئات الفرعية.
ترتيب بناء الماكينات هو عكس التسلسل الخطي للفئات. التسلسل الخطي هو تقنية تحديد جميع الأنواع الفرعية لأي نوع معين.