Scala(3)-Traits

来源:互联网 发布:淘宝售后申请时间限制 编辑:程序博客网 时间:2024/06/05 20:33

  • Defining a trait
  • Using traits
  • Subtyping

Traits中文意思是特征、特质、性状等,用于反映某种事物特有的东西。在专业领域中,有些名词我建议直接使用英文而不翻译,因为一个单词往往有多个中文含义,不同的人翻译过来的中文有可能不一样,可能不利于其他人准确理解某个事物的本质意义。

“Traits are used to share interfaces and fields between classes. They are similar to Java 8’s interfaces. Classes and objects can extend traits but traits cannot be instantiated and therefore have no parameters.”

上面摘自Scala官方文档的一段话,建议大家直接通过官方文档来学习Scala。

说下我个人对Traits的理解:同Java一样,Scala也不支持多继承。那么我们想要扩展一个类的功能特性时该怎么办呢?

比如,我们定义了一个Person类,Person可以run(),可以speak()(也就是这个类有这两个方法)。如果我们还想要Person会跳舞呢,我们当然可以定义一个Dancer类来继承Person类,另外给Dancer加一个dance()的功能;再如果,我们突发奇想,想让Person会飞呢?当然,我们同样可以定义一个Angel类继承Person类,再加一个fly()的功能。

现在,我们有一个Dog类,也想让Dog会飞,我们可以定义一个XiaoTianDog类继承自Dog类,并添加一个fly()方法。

假设,我们都很多类,想让这些类都会飞呢?是不是都要重新定义一个新的类,并给新类添加fly()方法呢?如果真的这样,我们要维护的类也太多了吧?

现在,我们把“飞” 这个功能抽出来,让所有想要飞的类共享这个功能就好了。这就是Scala中的Traits,也是Java中的Interface。不需要再定义Angel、XiaoTianDog等等新的类,让原有的类直接“实现” Traits,这样就给类扩展了功能特性。

通过Traits,一个类不用多继承也能够实现多种多样的功能。而且Traits是抽象出来的,是通用的、不包含某个类独有的东西,A类可以实现,B类同样可以实现。但继承不一样:一个Person类实现了fly()的功能,他就成了天使;可若是一个人继承了Bird类,那他就成了鸟人。

Defining a trait

一个最简单的trait仅仅包括一个关键词trait 和一个trait的名称:

trait HairColor

通过使用泛型和抽象方法,traits可以很强大:

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

Using traits

使用 extends 关键词来使用一个trait。使用 override 关键词来实现trait中的抽象方法:

// 定义一个Iterator traittrait Iterator[A] {  def hasNext: Boolean  def next(): A}// 通过extends,我们让IntIterator类具有了Iterator的两个方法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 0iterator.next()  // prints 1

Subtyping

trait的的实现子类型可以用于需要trait的地方。

import scala.collection.mutable.ArrayBuffertrait Pet {  val name: String}class Cat(val name: String) extends Petclass Dog(val name: String) extends Petval 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
原创粉丝点击