Skip to content

Instantly share code, notes, and snippets.

@mather
Created January 29, 2014 12:03
Show Gist options
  • Select an option

  • Save mather/8686572 to your computer and use it in GitHub Desktop.

Select an option

Save mather/8686572 to your computer and use it in GitHub Desktop.
traitのmix-inと依存性注入について(備忘録) ref: http://qiita.com/mather314/items/d0165374f657e42c35e0
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!'
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!'
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"
}
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!'と言いました
val userService: UserService = ???
val alice: User = userService.getById("Alice")
val result: Boolean = userService.activate(alice)
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