成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Scala的Trait:可以包含代碼的接口

開發 后端
本文介紹了Scala的Trait。除了從父類集成代碼外,Scala中的類還允許從一個或者多個traits中導入代碼。 對于Java程序員來說理解traits的最好方法就是把他們當作可以包含代碼的接口。

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

51CTO編輯推薦:Scala編程語言專題

7 Scala Trait

除了從父類集成代碼外,Scala中的類還允許從一個或者多個traits中導入代碼。

對于Java程序員來說理解traits的最好方法就是把他們當作可以包含代碼的接口(interface)。在Scala中,當一個類繼承一個trait時,它就實現了這個trait的接口,同時還從這個trait中繼承了所有的代碼。

讓我們通過一個典型的實例來看看這種trait機制是如何發揮作用的:排序對象。能夠比較若干給定類型的對象在實際應用中是很有用的,比如在進行排序時。在Java語言中可以比較的對象是通過實現Comparable接口完成的 。在Scala中我們可以通過吧Comparable定義為trait來做的比Java好一些。我們吧這個trait叫做Ord。

在比較對象時,一下六種關系通常使用率最高:小于、小于等于、等于、不等于、大于等于、大于。但是把他們都定義一次無疑是很沒用而且繁瑣的。尤其是六種關系中的四種其實是可以通過其他兩種關系導出的。例如給定等于和小于的定義后就可以推導出其他的定義。于是在Scala中,這些推導可以通過下面這個trait實現:

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)
}

這個定義在建立了一個叫做與Java中的 Comparable 等效的叫做 Ord的類型的同時還實現了使用抽象的一種關系推導其他三種的接口。比較相等性的方法沒有出現是由于他已經默認存在于所有對象中了。

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

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

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
}

注意在類名后出現的extends Ord。這表示了這個類繼承了Ord這個trait。

然后我們重新定義了equals這個從Object繼承來的方法,好讓他能夠正確的比較我們日期中的每個部分。原來的equals函數的行為與Java中的一樣,是按照對象的指針進行比較的。我們可以得出下面的代碼。

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

這個函數使用了預定義函數 isInstanceOf 和asInstanceOf 。第一個isInstanceOf 類似Java中的 instanceof :當且僅當對象是給定類型的實例時才返回true。第二個 asInstanceOf 對應Java中的類型轉換操作:當對象是給定類型的子類時轉換,否則拋出ClassCastException。

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

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的完整定義了。這個類的實例既可以作為日期顯示,也可以進行比較。而且他們都定義了6種比較操作:其中兩種 : equals和< 是我們直接定義的,而其他的是從Ord中繼承的。

Scala Traits 的應用遠不止于此,不過更加深入的討論不再本文的討論范圍內。

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

【相關閱讀】

  1. Scala的模式匹配和條件類
  2. Scala類:復數類,無參方法,繼承和覆蓋
  3. 萬物皆對象:介紹Scala對象
  4. Scala入門:Scala例子,以及如何與Java交互
  5. Scala開發環境搭建與資源推薦
責任編輯:yangsai 來源: Google Code
相關推薦

2017-02-28 15:48:11

Scala Trait設計模式框架

2013-12-04 14:19:40

JavaScript代碼重用

2009-07-22 07:45:00

Scala代碼重復

2011-03-18 19:37:38

Eventable接口QtWidget

2011-06-28 11:05:19

Qt QWidget Eventable

2020-10-31 17:33:18

Scala語言函數

2009-07-08 12:43:59

Scala ServlScala語言

2019-11-08 09:20:57

代碼開發工具

2023-11-29 13:59:00

trait定義接口

2010-09-14 15:34:41

Scala

2009-11-10 17:23:36

ScalaJDBCDAO

2009-07-22 07:47:00

Scala客戶代碼

2010-01-26 15:32:43

Scala用法錯誤

2009-12-29 10:19:15

ADSL代碼表

2009-11-16 17:04:46

Inside Scal

2009-07-21 17:16:34

Scala函數式指令式

2009-09-28 11:42:21

KestrelScala

2009-10-19 11:26:08

Scala循環數組

2009-12-09 09:15:47

從Java走進ScalTwitter API

2009-07-22 07:42:00

Scala偏應用函數
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产91网址| 欧美在线不卡 | 午夜精品一区二区三区在线视频 | 中文字幕日韩欧美 | 久久这里有精品 | 久久高清| 91电影| 免费不卡视频 | 美日韩免费 | 日韩有码一区 | 欧美专区在线视频 | 亚洲天堂中文字幕 | 日韩精品在线看 | 欧美一级视频在线观看 | 国产在线观看一区二区 | 久久一区二区视频 | 精品欧美一区二区三区久久久小说 | 久久狠狠 | 91看片在线 | 一区二区在线 | 久久毛片 | 国产欧美日韩精品一区二区三区 | 成人欧美一区二区三区在线观看 | 免费成人高清在线视频 | 国产欧美一区二区三区在线看 | 成人综合在线视频 | 国产一区二区三区视频 | 亚洲精品免费观看 | 国产乱码精品一区二三赶尸艳谈 | 三级av免费 | 亚洲精品免费在线观看 | 国家aaa的一级看片 h片在线看 | 天天av天天好逼 | 久久亚洲一区二区 | 欧美成人二区 | 99综合网 | 日韩激情视频一区 | 欧美日韩综合精品 | 日韩中文字幕免费 | 国产精品久久久久久一区二区三区 | 国产激情网站 |