在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

鍍金池/ 教程/ Scala/ Ordered Trait
包對象
Ordered Trait
組合和繼承–定義 final 成員
基本數(shù)據(jù)類型
Match 表達(dá)式
類和對象 (三)
操作基本數(shù)據(jù)類型
for 表達(dá)式
組合和繼承–重載成員函數(shù)和方法
類和對象 (二)
組合和繼承–定義 factory 對象
組合和繼承–多態(tài)和動態(tài)綁定
Trait 的基本概念
if 表達(dá)式
組合和繼承–抽象類
函數(shù)–函數(shù)字面量的一些簡化寫法
while 循環(huán)
組合和繼承–使用組合還是繼承?
訪問控制修飾符
Trait 示例–Rectangular 對象
組合和繼承–定義參數(shù)化成員變量
組合和繼承–定義無參數(shù)方法
類和對象 (一)
函數(shù)–閉包
函數(shù)–類成員函數(shù)
Scala 基本數(shù)據(jù)類型的實(shí)現(xiàn)方法
try 表達(dá)式處理異常
選擇瘦接口還是胖接口設(shè)計(jì)?
組合和繼承–小結(jié)
創(chuàng)建新的控制結(jié)構(gòu)
使用 import
為訪問控制修飾符添加作用域
Scala 的類層次關(guān)系
類和對象 (五)
傳名參數(shù)
柯里化函數(shù)
函數(shù)–頭等公民
組合和組合和繼承–定義 heighten 和 widen 函數(shù)
使用 Package–將代碼放入包中
隱含的 import
所有類的公共子類–底層類型
進(jìn)一步 Scala
函數(shù)–局部函數(shù)
引用包中的代碼
組合和繼承–使用 override 修飾符
組合和繼承–實(shí)現(xiàn)類 Element 的 above,beside 和 toString()方法
類和對象 (四)
函數(shù)–尾遞歸
沒有“break”和“continue”的日子
組合和繼承–調(diào)用基類構(gòu)造函數(shù)
減低代碼重復(fù)
函數(shù)–函數(shù)–可變參數(shù),命名參數(shù),缺省參數(shù)
起步 Scala
組合和繼承–擴(kuò)展類
函數(shù)–部分應(yīng)用的函數(shù)
開始神奇的 Scala編程之旅
組合和繼承–概述
Trait 用來實(shí)現(xiàn)可疊加的修改操作

Ordered Trait

比較對象也是胖接口來的比較方便的一個應(yīng)用領(lǐng)域,當(dāng)你需要比較兩個有順序關(guān)系的對象時(shí),如果只需要一個方法就可以知道需要比較的結(jié)果就非常便利。比如,你需要“小于”關(guān)系,你希望使用“< “比較就可以了,如果是“小于等于”,使用”<=”就可以。如果使用瘦接口來定義類,也許你只定義了一個<比較方法,那么如果需要小于等于,你可能需要使用(x<y)|| (x==y)。一個胖接口定義了所有可能的比較運(yùn)算符,使得你可以直接使用<=來書寫代碼。

但胖接口帶來的便利也是有代價(jià)的,回頭看看我們前面定義的Rational類;

如果我們需要定義比較操作,則需要定義如下代碼:

class Rational (n:Int, d:Int) {
 ...
  def < (that:Rational) =     this.numer * that.denom  > that.numer * this.denom
  def > (that:Rational) = that < this
  def <=(that:Rational) = (this < that) || (this == that)   def >=(that:Rational) = (this  > that) || (this == that)
}

這個類定義了四個比較運(yùn)算符 < ,>,< =和>=。首先我們注意到后面三個比較運(yùn)算符,都是通過第一個比較運(yùn)算符來實(shí)現(xiàn)的。其次,我們也可以看到,后面三個比較操作對于任意對象都是適用的,和對象的類型無關(guān)。而需要實(shí)現(xiàn)這四個比較運(yùn)算的胖接口都要重復(fù)這些代碼。

Scala 對于比較這種常見的操作,提供了 Ordered Trait 定義,使用它,你可以把所有的比較運(yùn)算的代碼使用一個 compare 定義來替代。這個 ordered trait 可以讓需要實(shí)現(xiàn)比較運(yùn)算的類,通過和 Ordered 特質(zhì)“融合”,而只需實(shí)現(xiàn)一個 compare 方法即可。

因此我們可以修改前面的實(shí)現(xiàn)如下:

class Rational (n:Int, d:Int) extends Ordered[Rational]{
  ...
  override def compare (that:Rational)=
    (this.numer*that.denom)-(that.numer*that.denom)
}

要注意兩點(diǎn),一是 Ordered 需要指明類型參數(shù) Ordered[T] ,類型參數(shù)我們將在后面介紹,這里只需要知道添加所需比較類型的類名稱,本例為 Rational,此外,需要使用 compare 方法。 它比較有序?qū)ο螅?0,表示兩個對象相同,>0表示前面大于后面對象,<0表示前面小于后面對象。

下面為測試結(jié)果:

scala> class Rational (n:Int, d:Int) extends Ordered[Rational]{
     |   require(d!=0)
     |   private val g =gcd (n.abs,d.abs)
     |   val numer =n/g
     |   val denom =d/g
     |   override def toString = numer + "/" +denom
     |   def +(that:Rational)  =
     |     new Rational(
     |       numer * that.denom + that.numer* denom,
     |       denom * that.denom
     |     )
     |   def * (that:Rational) =
     |     new Rational( numer * that.numer, denom * that.denom)
     |   def this(n:Int) = this(n,1)
     |   private def gcd(a:Int,b:Int):Int =
     |     if(b==0) a else gcd(b, a % b)
     |
     |   override def compare (that:Rational)=
     |     (this.numer*that.denom)-(that.numer*that.denom)
     |
     | }
defined class Rational
scala> val half =new Rational(1,2)
half: Rational = 1/2
scala>   val third=new Rational(1,3)
third: Rational = 1/3
scala> half < third res0: Boolean = false
scala> half >= third
res1: Boolean = true

因此,你在需要實(shí)現(xiàn)比較對象時(shí),首先需要考慮 Ordered Trait,看看這個 Trait 能否滿足要求,然后通過和這個 Trait “混合”就可以很方便的實(shí)現(xiàn)對象之間的比較。

此外要注意 Ordered Trait 沒有定義equal 方法,因?yàn)槿绻枰x equal 方法,那么需要檢查傳入?yún)?shù)的類型,Ordered Trait 無法實(shí)現(xiàn),因此你如果需要==比較運(yùn)算符,需要另外定義。