在Scala中,我如何建议自己的方法? [英] In Scala how can I advise my own methods?

查看:93
本文介绍了在Scala中,我如何建议自己的方法?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我想这样做:

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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆