Как насчет разделения логики представления (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
, поскольку вам нужно реализовать черту во время создания, но если вы можете контролировать создание экземпляра, это может сработать:).
Я почти уверен, что иначе это сделать невозможно (кто-то, пожалуйста, поправьте меня, если я ошибаюсь)