[译]Scala特征

特征用于在类之间共享接口和字段。类似于Java 8的接口。类和对象可以扩展特征,但是特征不能实例化,因此也没有参数。

定义特征

最简单的定义方法是trait关键字加上一个标识符:

trait HairColor

特征作为泛型类型尤其有用,并且带有抽象方法。

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

扩展trait Iterator[A]需要提供类型A,并且要实现hasNextnext方法。

使用特征

使用extends关键字扩展特征。然后使用override关键字实现特征的任意抽象成员。

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类有一个参数作为上边界值。扩展了Iterator[Int]next方法必须返回Int类型的值。

子类型

可以在需要会用特征的地方使用其子类型。

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有一个抽象字段nameCatDog在其构造函数中实现了。最后一行,调用了pet.name,在特征Pet的任意子类型中都必须实现。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 33,392评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,124评论 19 139
  • 前言 人生苦多,快来 Kotlin ,快速学习Kotlin! 什么是Kotlin? Kotlin 是种静态类型编程...
    任半生嚣狂阅读 26,525评论 9 118
  • 通过lineBreakMode设置标签文字过长时的显示方式。 label.lineBreakMode=NSLine...
    ZYiDa阅读 5,418评论 0 0
  • 一如你温柔的坠落 亲昵在发尾 消融在眉头 悄覆了枯叶 吻遍了泥土 你因寒附形却向死而生 冬日的雪啊 你是那么晶莹 ...
    安娜小笺阅读 3,165评论 19 18

友情链接更多精彩内容