日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問(wèn)題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營(yíng)銷解決方案
Scala的Trait:可以包含代碼的接口

本文源自Michel Schinz和Philipp Haller所寫的A Scala Tutorial for Java programmers,由Bearice成中文。第一篇為Scala簡(jiǎn)單做了一下入門,第二篇描述Scala對(duì)象,第三篇對(duì)Scala類做了一些介紹。第四篇介紹了Scala的模式匹配。下面這部分介紹Scala的Trait,直譯過(guò)來(lái)就是特性/特征的意思。

為紅旗等地區(qū)用戶提供了全套網(wǎng)頁(yè)設(shè)計(jì)制作服務(wù),及紅旗網(wǎng)站建設(shè)行業(yè)解決方案。主營(yíng)業(yè)務(wù)為成都網(wǎng)站建設(shè)、網(wǎng)站建設(shè)、紅旗網(wǎng)站設(shè)計(jì),以傳統(tǒng)方式定制建設(shè)網(wǎng)站,并提供域名空間備案等一條龍服務(wù),秉承以專業(yè)、用心的態(tài)度為用戶提供真誠(chéng)的服務(wù)。我們深信只要達(dá)到每一位用戶的要求,就會(huì)得到認(rèn)可,從而選擇與我們長(zhǎng)期合作。這樣,我們也可以走得更遠(yuǎn)!

編輯推薦:Scala編程語(yǔ)言專題

7 Scala Trait

除了從父類集成代碼外,Scala中的類還允許從一個(gè)或者多個(gè)traits中導(dǎo)入代碼。

對(duì)于Java程序員來(lái)說(shuō)理解traits的最好方法就是把他們當(dāng)作可以包含代碼的接口(interface)。在Scala中,當(dāng)一個(gè)類繼承一個(gè)trait時(shí),它就實(shí)現(xiàn)了這個(gè)trait的接口,同時(shí)還從這個(gè)trait中繼承了所有的代碼。

讓我們通過(guò)一個(gè)典型的實(shí)例來(lái)看看這種trait機(jī)制是如何發(fā)揮作用的:排序?qū)ο?。能夠比較若干給定類型的對(duì)象在實(shí)際應(yīng)用中是很有用的,比如在進(jìn)行排序時(shí)。在Java語(yǔ)言中可以比較的對(duì)象是通過(guò)實(shí)現(xiàn)Comparable接口完成的 。在Scala中我們可以通過(guò)吧Comparable定義為trait來(lái)做的比Java好一些。我們吧這個(gè)trait叫做Ord。

在比較對(duì)象時(shí),一下六種關(guān)系通常使用率最高:小于、小于等于、等于、不等于、大于等于、大于。但是把他們都定義一次無(wú)疑是很沒(méi)用而且繁瑣的。尤其是六種關(guān)系中的四種其實(shí)是可以通過(guò)其他兩種關(guān)系導(dǎo)出的。例如給定等于和小于的定義后就可以推導(dǎo)出其他的定義。于是在Scala中,這些推導(dǎo)可以通過(guò)下面這個(gè)trait實(shí)現(xiàn):

trait Ord {
        def < (that: Any): Boolean
        def <=(that: Any): Boolean = (this < that) || (this == that)
        def > (that: Any): Boolean = !(this <= that)
        def >=(that: Any): Boolean = !(this < that)
}

這個(gè)定義在建立了一個(gè)叫做與Java中的 Comparable 等效的叫做 Ord的類型的同時(shí)還實(shí)現(xiàn)了使用抽象的一種關(guān)系推導(dǎo)其他三種的接口。比較相等性的方法沒(méi)有出現(xiàn)是由于他已經(jīng)默認(rèn)存在于所有對(duì)象中了。

上面使用的叫做Any的類型表示了Scala中所有類的共同超類。事實(shí)上它就等于Java語(yǔ)言中的Object。

要使的一個(gè)類可以被比較,就需要可以比較他們是否相等或者大小關(guān)系,而這些都混合在上面的類Ord中了?,F(xiàn)在我們來(lái)寫一個(gè)Date類來(lái)表示格利高里歷中的日期。這個(gè)日期由年、月、日三個(gè)部分組成,每個(gè)部分都可以用一個(gè)整數(shù)表示。所有我們就得出了下面這個(gè)定義:

class Date(y: Int, m: Int, d: Int) extends Ord {
        def year = y
        def month = m
        def day = d
        override def toString(): String = year + "-" + month + "-" + day
}

注意在類名后出現(xiàn)的extends Ord。這表示了這個(gè)類繼承了Ord這個(gè)trait。

然后我們重新定義了equals這個(gè)從Object繼承來(lái)的方法,好讓他能夠正確的比較我們?nèi)掌谥械拿總€(gè)部分。原來(lái)的equals函數(shù)的行為與Java中的一樣,是按照對(duì)象的指針進(jìn)行比較的。我們可以得出下面的代碼。

override def equals(that: Any): Boolean =
that.isInstanceOf[Date] && {
        val o = that.asInstanceOf[Date]
        o.day == day && o.month == month && o.year == year
}

這個(gè)函數(shù)使用了預(yù)定義函數(shù) isInstanceOf 和asInstanceOf 。第一個(gè)isInstanceOf 類似Java中的 instanceof :當(dāng)且僅當(dāng)對(duì)象是給定類型的實(shí)例時(shí)才返回true。第二個(gè) asInstanceOf 對(duì)應(yīng)Java中的類型轉(zhuǎn)換操作:當(dāng)對(duì)象是給定類型的子類時(shí)轉(zhuǎn)換,否則拋出ClassCastException。

最后我們還需要定義測(cè)試小于關(guān)系的函數(shù),如下面所示。這個(gè)函數(shù)使用了預(yù)定義的函數(shù)error ,它可以使用給定字符串拋出一個(gè)異常。

def <(that: Any): Boolean = {
        if (!that.isInstanceOf[Date])
                error("cannot compare " + that + " and a Date")
        val o = that.asInstanceOf[Date] (year < o.year) ||
                (year == o.year && (month < o.month ||
                (month == o.month && day < o.day)))
}

以上就是Data的完整定義了。這個(gè)類的實(shí)例既可以作為日期顯示,也可以進(jìn)行比較。而且他們都定義了6種比較操作:其中兩種 : equals和< 是我們直接定義的,而其他的是從Ord中繼承的。

Scala Traits 的應(yīng)用遠(yuǎn)不止于此,不過(guò)更加深入的討論不再本文的討論范圍內(nèi)。

下一篇文章將是這個(gè)介紹的最后一部分,講述Scala的泛型。

【相關(guān)閱讀】

  1. Scala的模式匹配和條件類
  2. Scala類:復(fù)數(shù)類,無(wú)參方法,繼承和覆蓋
  3. 萬(wàn)物皆對(duì)象:介紹Scala對(duì)象
  4. Scala入門:Scala例子,以及如何與Java交互
  5. Scala開發(fā)環(huán)境搭建與資源推薦

分享文章:Scala的Trait:可以包含代碼的接口
標(biāo)題鏈接:http://www.dlmjj.cn/article/cdgjgdp.html