2

私はこれをしたい:

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 {
}

しかし、それが物事を壊すので、時々私は本当にそれをしたくありません。私の知る限り、線形化の順序だけが邪魔になりますが、それを変更する方法がわかりません。何がこれをきれいにするのでしょうか?

4

1 に答える 1

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作成時にトレイトを実装する必要があるため、を使用することはできませんが、インスタンスの作成を制御できる場合は、これが機能する可能性があります:)。

私はそれ以外の方法でそれを行うことは不可能だと確信しています(私が間違っている場合は誰かが私を訂正してください)

于 2011-10-23T02:38:44.567 に答える