Scala特征
特性封装方法和字段定义,然后可以通过将它们混合成类被重用。不同于类继承,其中每个类都必须继承只有一个父类,一类可以在任意数量特质混合。
特征用于通过指定支持的方法的签名定义的对象类型。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代码,使用抽象类。
-
如果打算在已编译的形式分发,而且希望外部组织编写的类继承它,可能会倾向于使用抽象类。
-
如果效率是非常重要的,倾向于使用类。
本站文章除注明转载外,均为本站原创或编译
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创优秀实例教程
转载请注明:文章转载自:代码驿站 [http:/www.codeinn.net]
本文标题:Scala特征
本文地址:http://www.codeinn.net/scala/1222.html
欢迎任何形式的转载,但请务必注明出处,尊重他人劳动共创优秀实例教程
转载请注明:文章转载自:代码驿站 [http:/www.codeinn.net]
本文标题:Scala特征
本文地址:http://www.codeinn.net/scala/1222.html