scala中的self type(自身类型)与依赖注入

参考这里: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/

scala中的self type(自身类型)与依赖注入》上有2个想法

  1. 你好,self type 定义 structural type 处,Foo 定义应该是
    trait Foo{
    this: {def close:Unit} =>
    }
    原 StackOverflow 也是如此定义

发表评论

电子邮件地址不会被公开。 必填项已用*标注