参考这里:http://stackoverflow.com/questions/1990948/what-is-the-difference-between-scala-self-types-and-trait-subclasses
另见《Scala编程》一书 p352, 也提到过
self type
是用于依赖注入的,帖子里解释了。
写了一个小例子测试了一下:
scala> trait User { def name :String }
defined trait User
scala> trait B {
user : User => // 这里self-type没用this而是user,可以是任何名字
def foo() {
println(name)
}// 同样后边的name也不需要手动增加前缀 user.name,会被识别为user.name。
}
// 这里必须有 with User,否则报 Main.type 不符合 B's selftype B with User
scala> object Main extends B with User { override def name = "whj"; }
scala> Main.foo
whj
见《scala编程》p462术语表中自身类型的描述:
任何混入该特质的具体类必须确保它的类型符合特质的自身类型,自身类型最通常的应用是为了把大类分成若干特质。
另外,帖子里还有人提到
self-types
还可以用 structural type
,比如:
trait Foo{
this:{def close:Unit} =>
}
定义了任何要mix in Foo
的,必须实现一个 close 方法。This allows for safe mixins for duck-typing.
最后,这篇讲述依赖注入的(对比了几种注入方法),以后看看:
http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di/