我想这样做:
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,但如果你能控制实例创建,那么这可能会起作用:)。
我很确定这是不可能的,否则(有人请纠正我,如果我错了)