【问题标题】:Scala - mixing in a trait with its imports (inheriting imports)Scala - 将特征与其导入混合(继承导入)
【发布时间】:2012-02-16 08:03:44
【问题描述】:

我有以下代码:

trait A {
  import org.somepackage.C._
}

class B extends A {
  def getValue = value
                 ^^^^^
}

object C {
  var value = 5
}

B 类中的值不可见,这意味着A 类的固有导入没有被B 继承,尽管valueA 中完全可见。如何实现同时继承导入的效果,这样我就可以避免在 trait A 混入的多个类中显式导入相同的东西?

【问题讨论】:

标签: scala inheritance import


【解决方案1】:

不是一流实体的进口不会表现出您所期望的行为。相反,您可以重组您的设计以实现接近的目标:

trait A with C {

}

class B extends A {
  def getValue = value // Now this will work.
}

trait C {
  var value = 5
}

object C extends C

Scalaz 6 中使用此成语向尽可能少的导入的用户征税。

【讨论】:

  • 这似乎只在 C 是一个特征时才有效。如果C 是别的东西怎么办(在我的情况下,C 是一种方法)?当我尝试使用这种模式时,它只会显示Cannot resolve symbol C(其中C 是我将通过com.xyz.C 导入的方法的名称)。
  • 此外,如果我想包含所有内容,比如com.xyz._,该怎么办?
  • 对于以上两种情况,您需要将实现移动到一个特征,然后有一个简单地扩展特征的对象,就像在答案中一样。可以扩展特征以进行“混合”,而对象则不能。要包含所有内容,例如 com.xyz._,您需要通过包对象实现 com.xyz - 通过扩展具有所有实际实现的特征类似地实现包对象。然后,您可以使用该特征在其他地方“混入”。
猜你喜欢
  • 2020-11-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-12
  • 2018-06-02
  • 1970-01-01
  • 1970-01-01
  • 2010-11-08
相关资源
最近更新 更多