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



我想这样做:

trait Renderable {
    def render: String
}
trait Parens extends Renderable {
    abstract override def render = "(" + super.render + ")"
}
object Foo extends Renderable with Parens {
    def render = "Hello"
}

但是这不起作用,因为线性化顺序将parent放在Foo之后(Foo总是出现,当然)所以parent不能建议Foo.render.

我最后这样做:

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

但是有时候我真的不想那样做,因为那样会把事情搞砸。作为据我所知,线性化顺序是唯一的阻碍,但我不知道如何改变这一点。什么能让它更干净?

如何分离表示逻辑(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,因为你需要在创建时实现trait,但如果你能控制实例创建,那么这可能会起作用:)。

我很确定这是不可能的,否则(有人请纠正我,如果我错了)

相关内容

  • 没有找到相关文章

最新更新