私はこのblogの例に従おうとしています。私はその例を理解していますが、実装には問題があります。スカラケーキパターンとセルフタイプの注釈
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
実装のために促されたbecasueそれは私には奇妙に見えますEmailService
からは非表示になります。私はここで何が欠けていますか?
あなたのコメントを読んだ後、私が実際にやろうとしていることに近い例を理解しようとしています。
最初のスニペットはコンパイルされませんが、2番目の1人の意志...私は、彼らが依存しているデータベースを切り替えることができます異なるRepository
実装を持ちたい一日の終わりに は、私は1つを閉じています下のスニペットの
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"
}
}
}
'EmailServiceImpl'は' 'Database'を拡張' MongoDatabase'を拡張MongoUserDb'を拡張します。その階層のどこかに 'find'の実装がなければなりません(' EmailServiceImpl'は抽象的ではないので)。それは、自己型注釈やケーキパターンとは関係ありません。 – Jesper
私は理解しています。私はこの話題を学んでいるだけで、ブログはそのことを(少なくとも私にとっては)明確ではありませんでした。 – Killyz
あなたは私が投稿したコードを見ましたか、それは私が信じるあなたの目的を果たした可能性があります。 –