我想这样做:
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 {
}
但有时我真的不想这样做,因为它打破了局面。如 据我所知,线性化顺序是唯一阻碍的方式, 但我不知道改变这种情况的方法。什么可能使这个更清洁?
答案 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
,因为您需要在创建时实现特征,但如果您可以控制实例创建,那么这可能会起作用:)。
我很确定不可能这样做(如果我错了,请有人纠正我)