【问题标题】:Scala mixin to class instanceScala mixin 到类实例
【发布时间】:2011-12-18 11:41:25
【问题描述】:

是否可以在 Scala 中对类实例进行一些混入?

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

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

[背后的原因]
我只是想知道隐式对象和清单是否有一些魔力来实现类型类模式而无需显式调用隐式对象(如在 Haskell 中)。 但仅适用于单个对象。

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

【问题讨论】:

  • 你的意思是在x它被实例化之后,还是在实例化过程中混合额外的方法?
  • 实例化后。

标签: scala mixins


【解决方案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 instance(而不是 Person 类的所有实例)的行为就像 Person with Dog,只要隐含在范围内。

这在大多数情况下都有效,除非你的 trait 有自我类型。

【讨论】:

    【解决方案2】:

    这是不可能的。您可能会考虑使用 Dynamic trait 或 Kevin Wright 的 auto-proxy plugin,但是,无论哪种方式,您都将创建一个 new 对象,该对象也通过代理响应原始方法。

    【讨论】:

      【解决方案3】:

      你的意思是:

      val x = new MyClass with MyTrait
      

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

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

      【讨论】:

      • 抱歉,评论迟了,但请在问题帖子中查看编辑
      • 感谢您提供的附加信息,它应该在最初的问题中,因为它似乎是一个非常重要的问题:-) 我现在很好奇,为什么你需要在对象之后添加一个特征已实例化?您能否分享一些代码示例来说明您正在尝试做的事情?
      • 对不起 - 当我写的时候我认为它很清楚,但是在阅读你的答案后 2 天后我意识到它不是。这个问题只是为了兴趣,我在问题帖子中提供了更多信息。
      • 好吧,如果你有一个有效的用例,你可以把它放在the scala-debate上讨论
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-01-30
      • 1970-01-01
      • 1970-01-01
      • 2011-12-27
      • 1970-01-01
      • 2020-07-29
      • 1970-01-01
      相关资源
      最近更新 更多