是否可以定义一个未命名的特征并将其用作Scala中的mixin?

时间:2014-05-17 13:26:09

标签: scala mixins traits

我使用结构类型而不是包装器特征来实现蛋糕模式。我现在正在连接我的依赖关系:

trait GreeterDependency { def greeter = HelloGreeter }
val printer = new Printer with GreeterDependency

如果我可以做这样的事情会很好:

val printer = new Printer with trait { def greeter = HelloGreeter }

但是,我收到语法错误。有没有办法定义一个未命名的特征并将其用作这样的混合?

(为清楚起见,这是我的所有代码:http://ideone.com/vMDFYD

1 个答案:

答案 0 :(得分:3)

我并不完全确定你要去做什么,但我认为你正在寻找的是用匿名类中定义的抽象成员来实例化一个特征。如果是这样的话,你可以这样做:

val printer = new Printer { def greeter = HelloGreeter }

这是我现在正在使用的模式,以弥补特征无法定义构造函数参数的事实。

根据问题中的Ideone链接进行完全重构:

trait Greeter {
  def apply(name: String): String
}

object HelloGreeter extends Greeter {
  def apply(name: String) = s"Hello, $name!"
}

trait Printer {
  def greeter: Greeter

  def apply(name: String) = println(greeter(name))
}

object Main extends App {
  val printer = new Printer { def greeter = HelloGreeter }
  printer("rightfold")
}

在此处运行示例:http://ideone.com/mAumNY