浅谈Scala的特质(trait)

        虽然scala的特征至关于Java的接口,可是在使用上,我以为scala的特征更像抽象类。
一个trait 就是把一些共同的性质抽象出来,哪一个类须要就混入.

        好比咱们要开发一个2D图形库,必然涉及到矩形对象的定义。
一个矩形能够由对角线上的两个端点惟一肯定。矩形对象通常具备获取左右边界和获取宽度的方法。不妨定义以下的类:
class Point(val x: Int, val y: Int)  
class Rectangle(val topLeft: Point, val bottomRight: Poit){
    def left = topLeft.x
    def right = bottomRight.x
    def width = rigth - left 
   // more methods
}

考虑到按钮(Button), 文本框(TextBox)等具备“矩形形状”的对象都应该具备left right , width 这些方法,因而咱们天然而然会把具备“矩形”特征的操做抽象出来。然而在Java中,这种抽象遇到一点麻烦,若是咱们把这几个方法定义在Java接口(interface)中,则每一个实现这种接口的类都必须实现接口中的全部方法,事实上这三个方法:left, right,width在大部分的实现类中的默认实现都是雷同的。若是把他们定义在抽象类中,虽然能给出方法的默认实现,可是考虑到Java是单继承的语言,一旦选择继承了某个类,咱们也就失去继承其余类的机会了。所以,在Java中,一般的作法是先把方法定义在Java接口中,而后经过定义一些抽象类(这个抽象类可能不止实现了一个接口)来适配它,最终子类只需直接继承这个抽象适配类.

        scala的trait把一切变得简单,咱们能够直接在trait中给出left ,right ,width的默认实现,子类若是须要,则直接混入该特征。若是以为哪一个方法“不爽”,就override它。 Scala 的解决方案以下:
triat Rectangular{
   def topLeft: Point
   def  bottomRight: Point
   def left = topLeft.x
   def right = bottomRight.x
   def width = right - left   

   // other methods
}

class Rectangle(private val x: Point, private val y : Point) extends Rectangular{
   // other methods
}

So cool ~~~!

因为trait容许定义具体方法和成员变量,因此无需像Java那样定义不少抽象适配器。若是读者查阅Scala的api文档,就会发现它的集合框架就是按照这种思想设计的,从而赋予Scala集合框架不少强大的功能。