Created
January 29, 2014 12:03
-
-
Save mather/8686572 to your computer and use it in GitHub Desktop.
traitのmix-inと依存性注入について(備忘録) ref: http://qiita.com/mather314/items/d0165374f657e42c35e0
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| trait Greeter { | |
| def greetTo(to: String): String | |
| } | |
| class HelloGreeter(name: String) extends Greeter { | |
| def greetTo(to: String) = s"${name} says 'Hello ${to}!'" | |
| } | |
| new HelloGreeter("Alice").greetTo("Bob") //=> Alice says 'Hello Bob!' |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| trait Greeter { | |
| def greetTo(to: String): String | |
| } | |
| trait AbstractGreeter extends Greeter { | |
| def name: String | |
| def greet: String | |
| def greetTo(to: String) = s"${name} says '${greet} ${to}!'" | |
| } | |
| class HelloGreeter(val name: String) extends AbstractGreeter { | |
| val greet: String = "Hello" | |
| } | |
| new HelloGreeter("Alice").greetTo("Bob") //=> Alice says 'Hello Bob!' | |
| (new AbstractGreeter { def name = "Alice"; def greet = "Hi" }).greetTo("Bob") //=> Alice says 'Hi Bob!' |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| trait Greeter { | |
| def greetTo(to: String): String | |
| } | |
| trait AbstractEnglishGreeter extends Greeter { | |
| def name: String | |
| def greet: String | |
| def greetTo(to: String) = s"${name} says '${greet} ${to}!'" | |
| } | |
| trait AbstractJapaneseGreeter extends Greeter { | |
| def name: String | |
| def greet: String | |
| def greetTo(to: String) = s"${name} は'${greet} ${to}!'と言いました" | |
| } | |
| class HelloEnglishGreeter(val name: String) extends AbstractEnglishGreeter { | |
| val greet: String = "Hello" | |
| } | |
| class HelloJapaneseGreeter(val name: String) extends AbstractJapaneseGreeter { | |
| val greet: String = "Hello" | |
| } |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| trait Greeter { | |
| def greetTo(to: String): String | |
| } | |
| trait AbstractGreeter extends Greeter { | |
| def name: String | |
| def greet: String | |
| } | |
| trait EnglishGreeter extends AbstractGreeter { | |
| def greetTo(to: String) = s"${name} says '${greet} ${to}!'" | |
| } | |
| trait JapaneseGreeter extends AbstractGreeter { | |
| def greetTo(to: String) = s"${name} は'${greet} ${to}!'と言いました" | |
| } | |
| class HelloGreeter(val name: String) { | |
| // コンパイル時にmix-inが必要なレイヤー | |
| this: AbstractGreeter => | |
| val greet: String = "Hello" | |
| // AbstractGreeter のメソッドを利用できる | |
| def yellTo(to: String) = greetTo(to).toUpperCase | |
| } | |
| val alice = new HelloGreeter("Alice") with JapaneseGreeter | |
| alice.greetTo("Bob") //=> Alice は'Hello Bob!'と言いました | |
| alice.yellTo("Bob") //=> ALICE は'HELLO BOB!'と言いました |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| val userService: UserService = ??? | |
| val alice: User = userService.getById("Alice") | |
| val result: Boolean = userService.activate(alice) |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| class User | |
| trait UserDao { | |
| def dbHost: String | |
| def dbName: String | |
| def getById(id: String): User | |
| } | |
| trait PostgresUserDao extends UserDao { | |
| def getById(id: String): User = ... | |
| } | |
| trait UserActivator { | |
| def activate(user: User): Boolean | |
| } | |
| trait LDAPUserActivator extends UserActicator { | |
| def activate(user: User): Boolean = ... | |
| } | |
| class UserService { | |
| this: UserDao with UserActivator => | |
| } | |
| // 実装の配線と設定値の挿入 | |
| val userService = new UserService extends PostgresUserDao with LDAPUserActivator { | |
| val dbHost = "192.168.1.1" | |
| val dbName = "db1" | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment