拆分scala类同时保留这种访问权限

时间:2015-04-11 16:12:33

标签: scala

我将一个大类分成一个类和一个混合到类中的特征。从特质中访问班级成员有哪些选择?

简要描述了手头的任务:

class A extends B {
  def someA = 3
}

trait B {
  def someB = someA + 3 
}

目前我在B的每个成员函数中都需要一个A类型的对象作为参数,这与上面所示的不同,当然这样做是有效的:

trait B {
  def someB(a: A) = a.someA + 3 // not found: value SomeA
}

可以很好地使用类似上面的代码,或者在特征中使用的thisself

当在类和特征之间移动方法时,动机变化较小,并且两个位置的代码看起来完全相同。我所知道的一种方式是自我类型。还有什么吗?

1 个答案:

答案 0 :(得分:4)

一种方法是使用自我类型,如上所述:

class A extends B {
  def someA = 3
}

trait B {
  this: A =>
  def someB = someA + 3
}

另一种方法是将someA作为B中的抽象方法,并让A为其提供具体实现:

class A extends B {
  def someA = 3
}

trait B {
  def someA: Int
  def someB = someA + 3
}

或者在子类型层次结构中将此方法定义得更高,如果A依赖于多个特征必须使用someA

,则此方法很有用
class A extends B {
  def someA = 3
}

trait B extends C {
  def someB = someA + 3
}

trait C {
  def someA: Int
}