在Scala中,我如何建议自己的方法? [英] In Scala how can I advise my own methods?
问题描述
我想这样做:
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.
But this does not work because the linearization order puts Parens after Foo (Foo always comes, of course) so Parens can't advise Foo.render.
我最终这样做:
trait FooRender {
def render = "Hello"
}
object Foo extends FooRender with Parens {
}
但是有时候我真的不想这么做,因为它会使事情分崩离析.作为 据我所知,线性化顺序是唯一的障碍, 但我不知道改变这种状况的方法.什么可以使这种清洁剂?
But sometimes I really don't want to do that because it breaks things up. As far as I can tell, linearization order is the only thing getting in the way, but I don't know a way to change that. What might make this cleaner?
推荐答案
如何将表示逻辑(render
)和实际内容(value
)分开?
How about separating the presentation logic (render
) and the actual contents (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)'
编辑
找到了一种可以完成几乎所有想要的事情的方法,请检查一下:
Edit
Found a way you can do pretty much what you wanted, check it out:
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
,因为您需要在创建时实现特征,但是如果您可以控制实例的创建,那么这可能会起作用:).
You can't use an object
since you need to implement the trait at creation time, but if you can control the instance creation then this might work :).
我很确定否则是不可能的(如果我错了,请有人纠正我)
I'm pretty sure it's not possible to do it otherwise (someone please correct me if I'm wrong)
这篇关于在Scala中,我如何建议自己的方法?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!