Scala mixin到类实例

时间:2011-10-31 03:44:10

标签: scala mixins

在Scala中是否可以将一些mixin转换为类实例?

例如:我有一些MyClass实例var x = new MyClass,我想在某些方法或特征上扩展它而不复制它。

[编辑:]
我正在寻找在实例化之后扩展x的方法。 因此,例如在函数方法中,它将x作为参数。

[背后是什么]
我只是想知道是否有一些神奇的隐式对象和Manifest来实现类型类模式而没有显式调用隐式对象(比如在Haskell中)。 但仅适用于单个物体。

我知道这是否是人为的,但我只是想知道它是否可能因为混合了Scalas功能的魔法很多。

3 个答案:

答案 0 :(得分:3)

你的意思是:

val x = new MyClass with MyTrait

是的,你可以。只是重写方法显然可以是:

val x = new MyClass { 
  override def myMethod = { my implementation }
} 

答案 1 :(得分:1)

刚刚遇到这个问题,因为我想知道同样的事情......

case class Person(name: String)
val dave = Person("Dave")
val joe  = Person("Joe")

trait Dog { val dogName: String }
val spot = new Dog { val dogName = "Spot" }

implicit def daveHasDog(p: dave.type) = spot

dave.dogName //"Spot"
joe.dogName  //error: value dogName is not a member of Person

所以现在dave 实例(而不是类Person的所有实例)的行为类似于Person with Dog,只要隐含在范围内。

这在大多数情况下都有效,除非您的特质具有自我类型。

答案 2 :(得分:0)

这是不可能的。您可以查看使用Dynamic trait或Kevin Wright的auto-proxy plugin,但无论如何,您将创建一个 new 对象,该对象也通过代理回答原始方法。