[譯]Scala特征

特征用于在類之間共享接口和字段。類似于Java 8的接口。類和對(duì)象可以擴(kuò)展特征,但是特征不能實(shí)例化,因此也沒(méi)有參數(shù)。

定義特征

最簡(jiǎn)單的定義方法是trait關(guān)鍵字加上一個(gè)標(biāo)識(shí)符:

trait HairColor

特征作為泛型類型尤其有用,并且?guī)в谐橄蠓椒ā?/p>

trait Iterator[A] {
  def hasNext: Boolean
  def next(): A
}

擴(kuò)展trait Iterator[A]需要提供類型A,并且要實(shí)現(xiàn)hasNextnext方法。

使用特征

使用extends關(guān)鍵字?jǐn)U展特征。然后使用override關(guān)鍵字實(shí)現(xiàn)特征的任意抽象成員。

trait Iterator[A] {
  def hasNext: Boolean
  def next(): A
}


class IntIterator(to: Int) extends Iterator[Int] {
  private var current = 0
  override def hasNext: Boolean = current < to
  override def next(): Int =  {
    if (hasNext) {
      val t = current
      current += 1
      t
    } else 0
  }
}


val iterator = new IntIterator(10)
iterator.next()  // prints 0
iterator.next()  // prints 1

IntIterator類有一個(gè)參數(shù)作為上邊界值。擴(kuò)展了Iterator[Int]next方法必須返回Int類型的值。

子類型

可以在需要會(huì)用特征的地方使用其子類型。

import scala.collection.mutable.ArrayBuffer

trait Pet {
  val name: String
}

class Cat(val name: String) extends Pet
class Dog(val name: String) extends Pet

val dog = new Dog("Harry")
val cat = new Cat("Sally")

val animals = ArrayBuffer.empty[Pet]
animals.append(dog)
animals.append(cat)
animals.foreach(pet => println(pet.name))  // Prints Harry Sally

trait Pet有一個(gè)抽象字段nameCatDog在其構(gòu)造函數(shù)中實(shí)現(xiàn)了。最后一行,調(diào)用了pet.name,在特征Pet的任意子類型中都必須實(shí)現(xiàn)。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法,內(nèi)部類的語(yǔ)法,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法,線程的語(yǔ)...
    子非魚(yú)_t_閱讀 34,734評(píng)論 18 399
  • Spring Cloud為開(kāi)發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見(jiàn)模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,578評(píng)論 19 139
  • 前言 人生苦多,快來(lái) Kotlin ,快速學(xué)習(xí)Kotlin! 什么是Kotlin? Kotlin 是種靜態(tài)類型編程...
    任半生囂狂閱讀 26,701評(píng)論 9 118
  • 通過(guò)lineBreakMode設(shè)置標(biāo)簽文字過(guò)長(zhǎng)時(shí)的顯示方式。 label.lineBreakMode=NSLine...
    ZYiDa閱讀 1,584評(píng)論 0 0
  • 一如你溫柔的墜落 親昵在發(fā)尾 消融在眉頭 悄覆了枯葉 吻遍了泥土 你因寒附形卻向死而生 冬日的雪啊 你是那么晶瑩 ...
    安娜小箋閱讀 500評(píng)論 19 18

友情鏈接更多精彩內(nèi)容