私はこのブログの例に従おうとしています。例は理解できますが、実装に問題があります。
trait Database {
// ...
}
trait UserDb {
this: Database =>
// ...
}
trait EmailService {
this: UserDb =>
// Can only access UserDb methods, cannot touch Database methods
}
この例では、完全なデータベース機能が EmailService から隠されることに言及しています。これは私が求めているものですが、これらの特性を正しく実装する方法がわかりません。
これは私が実装しようとしたものです:
trait Database {
def find(query: String): String
}
trait UserDb {
this: Database =>
}
trait EmailService {
this: UserDb =>
}
trait MongoDatabase extends Database {
}
trait MongoUserDb extends UserDb with MongoDatabase{
}
class EmailServiceImpl extends EmailService with MongoUserDb {
override def find(query: String): String = {
"result"
}
}
MongoDatabase トレイトが実装を要求しなかったため、私には奇妙にfind
見えます。ここで何が欠けていますか?EmailService
find
EmailService
あなたのコメントを読んだ後、私が実際にやろうとしていることにより近い例で、理解しようとしていることを実装しようとしています。
最初のスニペットはコンパイルされませんが、2 番目のスニペットはコンパイルされます... 結局のところ、Repository
依存しているデータベースを切り替えることができるさまざまな実装が必要です。
trait Database {
def find(s: String): String
}
trait Repository {
this: Database =>
}
class UserRepository extends Repository {
def database = new MongoDB
class MongoDB extends Database {
def find(s: String): String = {
"res"
}
}
}
trait Repository {
def database: Database
trait Database {
def find(s: String): String
}
}
trait UserRepository extends Repository {
def database = new MongoDB
class MongoDB extends Database {
def find(s: String): String = {
"res"
}
}
}