1. 程式人生 > >scala 與groovy 語法對比----長期更新

scala 與groovy 語法對比----長期更新

最近在學scala的同時也在接觸groovy,因為每個語言都有很多相同點和不同點,拿出來比較就不容易混亂了。太基本的語法這裡就不列出來對比了,只列出些遇到的比較重要的語法或者特性之間容易混淆的東西。

一、traits 特性

在scala中 traits的出現是為了代替java中的interface,與interface不同的是,interface只可以宣告抽象方法,而traits可以宣告抽象/具體屬性,抽象/具體方法。可以這麼說,trait內部的寫法可以與一個普通的類沒什麼區別。並且trait可以被多重繼承。

在groovy中也是如此。

那麼它們有什麼不同呢?普通的語法格式這裡就不指出來了,就說說多重繼承的區別。

1-1擺例子

scala程式碼

trait Logged {
def log(msg: String) // This method is abstract
}

trait ShortLogger extends Logged {
val maxLength = 15 // A concrete field
override def log(msg: String){print("23")}
def fun(){}
}
trait ShortLogger1 extends Logged {
 val maxLength = 16 // A concrete field
override def log(msg: String){print("2sdf3")}
 def fun(){}
}
// 這裡會報錯,因為scala並不知道使用哪個maxLength屬性和fun()方法,解決辦法是 分別override覆蓋maxLength屬性和fun()方法
class SavingsAccount extends ShortLogger with ShortLogger1{												  /* override val maxLength = 17*/															  }
groovy程式碼:
trait Logged {
    void log(String msg){}
}

trait ShortLogger extends Logged {
    def  maxLength = 15 // A concrete field
    void log(String msg){print("23")}
}
trait ShortLogger1 extends Logged {
    def maxLength = 16 // A concrete field
    void log(String msg){print("2sdf3")}
}
// 這裡實現的兩個traits中,後者會覆蓋前者
class SavingsAccount implements  ShortLogger , ShortLogger1{

}
def sa = new SavingsAccount();
println(sa.maxLength);
sa.log("haha")
結果:
16
2sdf3

總結:groovy的語法看上去更智慧一點,但是它卻強硬地幫我們做出了選擇,後者一定會覆蓋前者。而sacla看上去比較死板,如果需要用到多個特性並保留每個屬性或方法,那麼各個trait的屬性名和方法名儘量不應該相同,可以加個字首。