我将一个大类分成一个类和一个混合到类中的特征。从特质中访问班级成员有哪些选择?
简要描述了手头的任务:
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
}
可以很好地使用类似上面的代码,或者在特征中使用的this
或self
。
当在类和特征之间移动方法时,动机变化较小,并且两个位置的代码看起来完全相同。我所知道的一种方式是自我类型。还有什么吗?
答案 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
}