[译]Scala特征

作者: steanxy | 来源:发表于2017-05-03 22:31 被阅读157次

    特征用于在类之间共享接口和字段。类似于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的任意子类型中都必须实现。

    相关文章

      网友评论

        本文标题:[译]Scala特征

        本文链接:https://www.haomeiwen.com/subject/cxgltxtx.html