在Scala中,我如何建议自己的方法?
我想这样做:在Scala中,我如何建议自己的方法?,scala,traits,mixins,linearization,Scala,Traits,Mixins,Linearization,我想这样做: 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之后
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 {
}
但有时候我真的不想那样做,因为那样会把事情搞砸。像
据我所知,线性化顺序是唯一的障碍,
但我不知道有什么办法可以改变这一点。什么可以使它更干净?如何将表示逻辑(
呈现
)和实际内容(值
)分开
编辑 找到了一种几乎可以做你想做的事情的方法,请查看:
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)
您不能使用对象
,因为您需要在创建时实现trait,但是如果您可以控制实例的创建,那么这可能会起作用:)
我很确定,如果不这样做,就不可能做到(如果我错了,请有人纠正我),因为这样特质就不再叠加了。不过,这是我偶尔使用的另一个选项。你所说的“traits不堆叠”是什么意思?你发布的代码的问题是你的
Foo
已经定义了render
方法,因此不需要在调用层次结构上寻找其他实现。它将始终执行Foo
方法我的意思是,如果Parens在“内部”中有value
,在“外部”中有render
,则不能像mixin一样使用它;也就是说,它不能与按照同一模式定义的其他特征组合,这才是我真正想要的。这里的“可堆叠”是渲染行为。值不是
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)