在Scala中,我如何建议自己的方法?

时间:2011-10-23 02:22:36

标签: scala traits mixins linearization

我想这样做:

trait Renderable {
    def render: String
}

trait Parens extends Renderable {
    abstract override def render = "(" + super.render + ")"
}

object Foo extends Renderable with Parens {
    def render = "Hello"
}

但这不起作用,因为线性化顺序将Parens置于Foo之后 (Foo总是来的,所以Parens不能告诉Foo.render。

我最终这样做了:

trait FooRender {
    def render = "Hello"
}

object Foo extends FooRender with Parens {
}

但有时我真的不想这样做,因为它打破了局面。如 据我所知,线性化顺序是唯一阻碍的方式, 但我不知道改变这种情况的方法。什么可能使这个更清洁?

1 个答案:

答案 0 :(得分:2)

如何分离表示逻辑(render)和实际内容(value)?

trait Renderable {
  def value : String
  def render = value // default presentation logic, simple rendering.
}

trait Parens extends Renderable {
  override def render :String = "(" + value + ")" // parens rendering.
}

object Foo extends Parens {
  def value = "Hello"
}

println(Foo.render) // prints '(Hello)'

修改

找到一种可以做你想做的事的方法,看一下:

trait Renderable {
  def render: String
}

trait Parens extends Renderable {
  abstract override def render = "(" + super.render + ")"
}

class Foo extends Renderable {
  def render = "Hello"
}

val foo = new Foo with Parens
println(foo.render)

您不能使用object,因为您需要在创建时实现特征,但如果您可以控制实例创建,那么这可能会起作用:)。

我很确定不可能这样做(如果我错了,请有人纠正我)