Tho*_*ung 53
特征的一个方面是它们是可堆叠的.允许约束形式的AOP(围绕建议).
trait A{
def a = 1
}
trait X extends A{
override def a = {
println("X")
super.a
}
}
trait Y extends A{
override def a = {
println("Y")
super.a
}
}
scala> val xy = new AnyRef with X with Y
xy: java.lang.Object with X with Y = $anon$1@6e9b6a
scala> xy.a
Y
X
res0: Int = 1
scala> val yx = new AnyRef with Y with X
yx: java.lang.Object with Y with X = $anon$1@188c838
scala> yx.a
X
Y
res1: Int = 1
Run Code Online (Sandbox Code Playgroud)
分辨率super反映了继承层次的线性化.
Oak*_*Oak 14
从概念上讲,特质是一个阶级的一个组成部分,而不是一个阶级本身.因此,它通常没有构造函数,并不意味着"独立".
我建议在它具有独立意义时使用抽象类,当你只想以面向对象的方式添加功能时使用traits.如果你不确定两者之间,你可能会发现如果所有的方法都围绕着做一件事,你可能想要一个特征.
对于(非语言特定的)示例,如果您的Employee应该扩展"Person"和"Cloneable",请将Person设为基类,并将Cloneable设为特征.
| 归档时间: |
|
| 查看次数: |
52901 次 |
| 最近记录: |