Scala特征

于2017-07-06由小牛君创建

分享到:


特性封装方法和字段定义,然后可以通过将它们混合成类被重用。不同于类继承,其中每个类都必须继承只有一个父类,一类可以在任意数量特质混合。

特征用于通过指定支持的方法的签名定义的对象类型。Scala中也允许部分实现特性但可能不具有构造参数。

一个特征定义看起来就像不同的是它使用关键字trait如下类定义:

trait Equal {
  def isEqual(x: Any): Boolean
  def isNotEqual(x: Any): Boolean = !isEqual(x)
}

这种特质由两个方法的isEqual和isNotEqual。这里,我们没有给出任何实现的isEqual其中作为另一种方法有它的实现。扩展特性的子类可以给实施未实现的方法。因此,一个特点是非常相似Java的抽象类。下面是一个完整的例子来说明特性的概念:

trait Equal {
  def isEqual(x: Any): Boolean
  def isNotEqual(x: Any): Boolean = !isEqual(x)
}

class Yiibai(xc: Int, yc: Int) extends Equal {
  var x: Int = xc
  var y: Int = yc
  def isEqual(obj: Any) =
    obj.isInstanceOf[Yiibai] &&
    obj.asInstanceOf[Yiibai].x == x
}

object Test {
   def main(args: Array[String]) {
      val p1 = new Yiibai(2, 3)
      val p2 = new Yiibai(2, 4)
      val p3 = new Yiibai(3, 3)

      println(p1.isNotEqual(p2))
      println(p1.isNotEqual(p3))
      println(p1.isNotEqual(2))
   }
}

当上述代码被编译和执行时,它产生了以下结果:

C:/>scalac Test.scala
C:/>scala Test
false
true
true

C:/>

什么时候使用特性?

没有严格的规定,但这里有一些指导原则需要考虑:

  • 如果行为不被重用,则要使它成为一个具体的类。它毕竟不是可重复使用的行为。

  • 如果它可能在多个不相关的类被重用,使它成为一个性状。只有特性可混入的类层次结构的不同部分。

  • 如果想它从继承Java代码,使用抽象类。

  • 如果打算在已编译的形式分发,而且希望外部组织编写的类继承它,可能会倾向于使用抽象类。

  • 如果效率是非常重要的,倾向于使用类。