【问题标题】:Adding a specific Trait to a Class at runtime在运行时向类添加特定特征
【发布时间】:2011-05-12 13:44:29
【问题描述】:

我有一些方法的特征“Foo”。我想将这个特性混合到任何课程中。但我不想写类似

val b = new Bar with Foo

我需要一些东西,比如我刚通过一门课,它与 Foo 混合在一起。我只想与此特征混合,即所有类都应仅与 Foo 特征混合。

val b = new Factory(Bar) //Factory returns instance with trait Foo

我找到了这个post,但我不相信。

这样的事情在 scala 中是可能的吗?

【问题讨论】:

  • 在那个工厂示例中,您传递的是 type Bar 还是 Barinstance?如果是后者,这是不可能的,尽管隐式转换通常就足够了。

标签: scala


【解决方案1】:

目前最好的解决方案是像这样实现Foo

class Foo(bar:Bar) {
    ...
}
object Foo {
    def apply(bar:Bar) = new Foo(bar)
    implicit def backToBar = this.bar
}

然后将其用作

val foo = Foo(myBar)

对于在FooBar 之间共享的任何方法名称,将使用Foo 中的版本(与mixin 中的重载一样)。任何其他方法,将使用Bar 上的变体。

该技术并不完美,Bar 中的方法只会调用Bar 中定义的其他方法,并且永远不会“重载”Foo 中定义的方法。否则,它非常接近您的需求。

【讨论】:

  • 我是 scala 新手,但上面的交互式 scala shell 代码不起作用,其他东西 Bar 是可变的,即它可以是(Bar with Foo)或(Boo with Foo),我没有得到上面的代码,它到底做了什么
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-14
  • 2017-02-21
  • 2013-05-11
  • 2018-03-15
  • 2020-07-31
相关资源
最近更新 更多