Scala代码:
trait X
trait Y1 {
this: X =>
}
trait Y2 extends X {
}
我想知道Y1
和Y2
特征之间有什么区别?如果我有课程Z
需要延长Y
:
class Z1 extend Y1 with X
class Z2 extends Y2
似乎两个班级Z1
和Z2
没有区别。如果它们几乎相同,你会推荐哪种风格?
答案 0 :(得分:2)
有时,您处于深度嵌套的范围内,并且别名对外部对象很有用,例如here。
正如here所解释的那样,this
的两种类型的线性化被反转。
也就是说,您有this: Y with X
和this: X with Y
。
this
重要(双关语):
scala> trait X { type T }
defined trait X
scala> trait Y { type T <: String ; def t: T ; def f = t.length }
defined trait Y
scala> trait Y { this: X => type T <: String ; def t: T ; def f = t.length }
<console>:8: error: value length is not a member of Y.this.T
trait Y { this: X => type T <: String ; def t: T ; def f = t.length }
^
scala> trait Y { this: X with Y => type T <: String ; def t: T ; def f = t.length }
defined trait Y
scala> trait Y extends X { type T <: String ; def t: T ; def f = t.length }
defined trait Y
但正如相关的权威性答案所说,这可能无关紧要。
答案 1 :(得分:1)
trait B extends A
表示B 是A。
trait B { this: A => }
是依赖注入 - 你希望B 要求 A.
考虑这两个REPL会话:
> trait A
defined trait A
> trait B extends A
defined trait B
> class C
defined class C
> new C with A
res0: C with A = $anon$1@706abf59
> new C with B
res1: C with B = $anon$1@2004aa19
而且:
> trait A
defined trait A
> trait B { this : A => }
defined trait B
> class C
defined class C
> new C with A
res0: C with A = $anon$1@1ef535db
> new C with B
<console>:11: error: illegal inheritance;
self-type C with B does not conform to B's selftype B with A
new C with B
^