scala學習-介紹scala的幾種特性6

案例來自於引路蜂
本文介紹完整的定義一個類。定義函數化對象,函數化對象的意思是所定義的類和對象都不包含任何可以修改的狀態。還會介紹Scala的幾種特性:類參數和構造函數,方法,操作符,私有成員,重載,過載,條件查詢,引用自身。
1類定義規範
定義一個有理數的類。有理數的定義:一個有理數可以表示成分數的形式:n/d,其中n和d都是整數,d不能爲0。
因此我們定義的個有理數類,Rational類,能支持上面的描述和有理數的操作。有理數的=-*/<,並且可以支持有理數的規範表達,比如2/10,其規範表達是1/5,分子和分母的最小公倍數爲1。
我們開始來定義這個類,定義成函數化對象,就說明裏面是沒有可變的狀態的,即是使用immutable方式來定義。我們需要定義分子和分母。

package org.wq.learn
class Rational (n:Int,d:Int)

這和java中定義的類不一樣,定義類的時候可以帶參數,這個叫做類參數。類參數就是和構造函數一樣的功能哈。這樣就簡化了代碼。
Scala編譯器會編譯任何不屬於類成員和類方法的其他代碼,因爲這些代碼將作爲類構造函數,比如在下面打印一條語句。

package org.wq.learn
class Rational (n:Int,d:Int){
  println("i am a class construction~"+n+"/"+d)
}
object Rational extends App{
  new Rational(1,2)
}
結果爲:i am a class construction~1/2

可以看見在創建對象的時候,自動執行了主構造函數的代碼。
2重定義類的toString方法
當你使用println打印類的時候

 println(new Rational(1,2))
 結果爲:org.wq.learn.Rational@74a14482

結果不直觀,這是因爲,使用了缺省的類作爲toString定義(object),缺省打印的是類名+@+16進制對象的地址。所以要重載toString方法。在Scala中,你可以使用override來重載方法,和java一樣。override要寫在def前面哦。

package org.wq.learn
class Rational (n:Int,d:Int){
  println("i am a class construction~"+n+"/"+d)
  override def  toString = n+"/"+d
}
object Rational extends App{
 println(new Rational(1,2))
}
結果爲:1/2

3前提條件檢測
有理數分母步能爲0,這裏是d不能爲0。前面定義,d爲0是可以運行的。怎麼解決分母不能爲0的問題呢。面向對象編程的一個有點是數據的封裝。對於一個有理數的前提條件是分母步爲0,Scala中定義了爲傳入構造方法和方法的參數的限制範圍,也就是說調用這些函數或者方法需要滿足這些條件。Scala中使用了require的方法(require爲Predef對象定義的一個方法,Scala環境自動載入這個類的定義,無需import),因此修改代碼爲:

package org.wq.learn
class Rational (n:Int,d:Int){
  println("i am a class construction~"+n+"/"+d)
  require(d!=0)
  override def  toString = n+"/"+d
}
object Rational extends App{
 println(new Rational(1,0))
}
結果爲:i am a class construction~1/0
Exception in thread "main" java.lang.IllegalArgumentException: requirement failed

如果分母爲0,就拋出IllegalArgumentException異常。
今天加班太累,就休息了……
明天繼續……

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章