淺談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集合框架不少強大的功能。
相關文章
相關標籤/搜索