`

Scala Traits

 
阅读更多

原创转载请注明出处:http://agilestyle.iteye.com/blog/2334648

 

Scala中的trait,相当于Java中interface,支持多种继承,但是语法还是有些差异的。

使用trait关键字定义特征,将多个特征组合到一个类中,需要以extends关键字开头,然后使用with关键字添加额外的特征

package org.fool.scala.traits

trait Color

trait Texture

trait Hardness

class Fabric

class Cloth extends Fabric with Color with Texture with Hardness

class Paint extends Color with Texture with Hardness

object Materials extends App {
  new Fabric
  new Cloth
  new Paint
}

 

跟抽象类一样,特征中的域和方法可以有定义,也可以是抽象的

package org.fool.scala.traits

trait AllAbstract {
  def f(n: Int): Int

  val d: Double
}

trait PartialAbstract {
  def f(n: Int): Int

  val d: Double

  def g(s: String) = s"($s)"

  val j = 42
}

trait Concrete {
  def f(n: Int) = n * 11

  val d = 1.8
}

 

单独的特征是不能实例化的,因为它没有全功能的构造器。

/* None of these are legal -- traits
cannot be instantiated:
new AllAbstract
new PartialAbstract
new Concrete
*/

 

在组合特征来生成新类时,所有域和方法都必须有定义,否则Scala会强制要求该类必须包含abstract关键字

// Scala requires 'abstract' keyword:
abstract class Klass1 extends AllAbstract with PartialAbstract

/* Can't do this -- d and f are undefined:
new Klass1
*/

 

这些定义可以由新类提供,e.g. Klass2,或者通过其他特征实现,e.g. Klass3、Klass4、Klass5中的Concrete(抽象类中的方法也支持这种操作)

class Klass2 extends AllAbstract {
  def f(n: Int) = n * 12

  val d = 3.14
}

class Klass3 extends AllAbstract with Concrete

class Klass4 extends PartialAbstract with Concrete

class Klass5 extends AllAbstract with PartialAbstract with Concrete

new Klass2
new Klass3
new Klass4
new Klass5

 

特征可以被抽象类或具体类继承

trait FromAbstract extends Klass1

trait FromConcrete extends Klass2

 

特征不能有构造器参数,但可以有构造器体

trait Construction {
  println("Constructor body")
}

class Constructable extends Construction

new Constructable

Console Output


 

show an interesting trick: creating an instance of a class that you assemble at the site of creation. The resulting object has no type name. This technique creates a single instance of an object without creating a new named class just for that one usage.

val x = new AllAbstract with PartialAbstract with Concrete

 

特征可以继承其他特征

package org.fool.scala.traits

trait Base {
  def f = "f"
}

trait Derived1 extends Base {
  def g = "17"
}

trait Derived2 extends Derived1 {
  def h = "1.23"
}

class Derived3 extends Derived2

object TraitInheritance extends App {
  val d = new Derived3
  println(d.f)
  println(d.g)
  println(d.h)
}

Console Output


 

组合特征时,有可能会将具有相同签名(方法与类型的组合)的两个方法混合在一起。如果方法或域的签名产生冲突,那么需要人工解决这种冲突,e.g. 在object C中看到的那样(这里object起到快捷方式的作用,通过它可以创建类,然后创建该类的一个实例)

package org.fool.scala.traits

trait A {
  def f = 1.1

  def g = "A.g"

  val n = 7
}

trait B {
  def f = 2.2

  def g = "B.g"

  val n = 17
}

object C extends A with B {
  override def f = 3.3

  override def g = super[A].g + super[B].g

  override val n = 27
}

object TraitCollision extends App {
  println(C.f)
  println(C.g)
  println(C.n)
}

Console Output


 

特征域和方法即使还未被定义,也可以在计算中使用它们

package org.fool.scala.traits

trait Framework {
  val part1: Int

  def part2: Double

  // even without definitions:
  def templateMethod = part1 + part2
}

class Implementation extends Framework {
  override val part1 = 12

  override def part2 = 1.23
}

object FrameworkTest extends App {
  def operation(impl: Framework) = impl.templateMethod

  println(operation(new Implementation))
}

Console Output


 

参考资料:

Scala编程思想 

 

  • 大小: 9 KB
  • 大小: 9.8 KB
  • 大小: 10 KB
  • 大小: 8.2 KB
分享到:
评论

相关推荐

    scala实战高清讲解

    7. **特质(Traits)** - 特质是Scala的多重继承机制,用于实现接口或者混合行为,可以避免Java中的钻石问题。 8. **元编程** - Scala的反射和宏能力允许在运行时检查和修改程序结构,实现元编程。 9. **对象...

    scala-2.12.6.tgz

    Scala还引入了一些独特的语言特性,如特质(Traits)、隐式转换和case类,这些帮助开发者实现更简洁、更具表达力的代码。 10. 社区与文档: Scala有一个活跃的社区,提供了丰富的开源库和工具,以及详尽的官方...

    scala-2.12.10.tgz

    它还引入了特质(Traits),一种可组合的行为单元,增强了代码的复用和模块化。 9. Akka框架:Scala广泛用于构建分布式系统,尤其是与Akka框架结合。Akka提供了actor模型,简化了并发和容错编程。 10. Play框架:...

    scala-2.12.7.zip

    2. **面向对象**:Scala支持类、接口和继承,同时引入了特质(Traits),提供了一种更灵活的实现多继承的方式。 3. **函数式编程**:Scala是函数式编程的强大平台,支持高阶函数、闭包、不可变数据结构以及柯里化等...

    scala-2.11.6.zip

    2. **面向对象编程**:Scala支持类、对象、继承和封装等传统面向对象概念,同时引入了特质(Traits),这是一种更灵活的接口实现方式。 3. **函数式编程**:Scala支持高阶函数、闭包和不可变数据结构,这些都是函数...

    scala2.10.4

    2. **新特性:Traits**:Scala 的 Traits 提供了一种实现多继承的方式,允许类或者特质组合多个行为。在 2.10.4 版本中,对 Traits 的支持更加完善,包括混合类型检查和优化。 3. **函数式编程强化**:Scala 2.10 ...

    Scala-升级版.docx

    4. **特质(Traits)**:Scala的特质类似于Java的接口和抽象类的结合体,提供了一种实现多继承和代码重用的方式,同时也支持混入(mix-in)以实现灵活的类结构。 5. **模式匹配**:模式匹配是Scala的一个强大功能,...

    scala源码-2.11.x.zip

    4. 特性实现:Scala支持许多独特的编程特性,如特质(Traits)、case类和模式匹配、 Actors模型等。在源码中,可以找到这些特性的具体实现,例如`scala-2.11.x/src/library/scala/concurrent/Actor.scala`展示了...

    Scala实操教程及演示

    4. **特质(Traits)**:Scala中的特质类似于Java中的接口和抽象类的组合,可以实现多重继承的效果。 5. **模式匹配**:Scala支持模式匹配,类似于Java中的switch语句,但功能更加强大,可以用于复杂的类型检查和...

    Scala语言规范.pdf

    它引入了特质(Traits),作为多重继承的替代,提供了代码复用和行为组合的方式。 3. **函数式编程**:Scala是函数式的,允许将函数视为一等公民,可以作为参数传递,也可以作为返回值。高阶函数、柯里化、闭包和不...

    Scala编程完整版

    在面向对象方面,Scala引入了特质(Traits),这是一种比Java的接口更加强大的抽象概念,可以包含实现代码,允许多重继承而避免了“菱形问题”。它还支持隐式转换,使得不同类型的对象之间可以无缝协作。 函数式...

    Spring 整合 Scala 编程【转】

    2. **Scala的特质(Traits)与Spring的接口**:Scala的特质类似于Java的接口,但更强大,可以包含实现。这使得Scala类能够实现Spring接口,参与到Spring的依赖注入体系中。 3. **类型安全的配置**:Spring 4.0及...

    scala深入学习

    学习如何利用特质来建模数据、理解密封特质(sealed traits)、使用特质进行数据建模、理解求和类型模式、递归数据结构以及模式匹配是学习Scala时的重点。 5. 数据建模:这部分内容会介绍如何使用Scala的高级特性来...

    Scala and Spark for Big Data Analytics.pdf

    Chapter 1, Introduction to Scala, will teach big data analytics using the Scalabased APIs of Spark. Spark itself is written with Scala and ... traits and trait linearization; and Java interoperability.

    IBM:面向Java开发人员的Scala指南-p178.7z

    在面向对象编程方面,Scala引入了特质(Traits),这是一种类似于Java接口但可以包含具体方法和变量的结构。特质可以被用来实现多重继承,避免了Java中的"菱形问题"。此外,Scala还支持匿名类和对象,使得代码更加...

    《Scala实用指南》代码清单

    4. 特质(Traits):Scala的特质可以看作是接口和抽象类的组合,支持多重继承,是实现行为重用的有效方式。 5. 类型系统:Scala的类型系统非常灵活,允许类型推断,同时支持泛型、类型别名和类型参数化,增强了代码...

    scala 语法参考中文pdf

    2. **特质(Traits)**:Scala的特质类似于Java的接口,但允许包含实现,可以多重继承,并通过混入(mix-in)机制实现代码复用。 3. **高阶函数**:Scala支持函数作为一等公民,可以作为参数传递,也可以作为返回值...

    scala 2.12.4

    然而,它还引入了特质(Traits),这是一种更灵活的实现接口和多重继承的方式。 3. **函数式编程**:Scala是函数式编程语言的代表,支持高阶函数、柯里化、模式匹配、不可变数据结构等概念。这些特性使得代码可读性...

    scala-traits-slides:关于 Scala 特征的幻灯片

    在Scala中,特征(Traits)是一个非常重要的概念,它提供了一种方式来实现代码重用和接口扩展,类似于Java中的接口和部分C++的混合类型。本讲座主要探讨Scala的特征及其在实际开发中的应用。 特征在Scala中的主要...

Global site tag (gtag.js) - Google Analytics