Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/react-native/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Scala中,我如何建议自己的方法?_Scala_Traits_Mixins_Linearization - Fatal编程技术网

在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)