在Scala中是否可以将一些mixin转换为类实例?
例如:我有一些MyClass实例var x = new MyClass
,我想在某些方法或特征上扩展它而不复制它。
[编辑:]
我正在寻找在实例化之后扩展x
的方法。
因此,例如在函数方法中,它将x
作为参数。
[背后是什么]
我只是想知道是否有一些神奇的隐式对象和Manifest来实现类型类模式而没有显式调用隐式对象(比如在Haskell中)。
但仅适用于单个物体。
我知道这是否是人为的,但我只是想知道它是否可能因为混合了Scalas功能的魔法很多。
答案 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 对象,该对象也通过代理回答原始方法。