首页 文章

Scala mixin到类实例

提问于
浏览
3

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

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

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

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

我知道如果是人为的,但我只是想知道它是否可能因为混合了Scalas功能的大量魔力 .

3 回答

  • 3

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

  • 0

    你的意思是:

    val x = new MyClass with MyTrait
    

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

    val x = new MyClass { 
      override def myMethod = { my implementation }
    }
    
  • 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 ,只要隐含在范围内 .

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

相关问题