Ich versuche, das Beispiel von diesem blog zu folgen. Ich verstehe das Beispiel, habe aber Probleme bei der Implementierung.Scala Kuchen Muster & Selbst Typ Anmerkungen
trait Database {
// ...
}
trait UserDb {
this: Database =>
// ...
}
trait EmailService {
this: UserDb =>
// Can only access UserDb methods, cannot touch Database methods
}
Das Beispiel erwähnt, dass die vollständige Datenbank-Funktionalität wird von dem Emailservice versteckt werden - das ist, was ich nach, aber nicht wissen, wie diese Eigenschaften korrekt umzusetzen.
Das ist, was ich zu implementieren versucht:
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"
}
}
Es sieht seltsam becasue MongoDatabase Merkmal nicht für find
Umsetzung gefragt hat und wenn ich EmailService
umgesetzt wurde ich dann für find
Implementierung gefragt werden, obwohl das Beispiel dies erwähnt wird von der versteckt werden. Was fehlt mir hier?
Nachdem ich Ihre Kommentare gelesen habe, versuche ich zu implementieren, was ich versuche zu verstehen, an einem Beispiel, das näher an dem ist, was ich eigentlich versuche.
Der erste Snippet wird nicht kompiliert, aber der zweite wird ... Am Ende des Tages ich verschiedene Repository
Implementierungen haben wollen, wo ich zwischen den Datenbanken auf sie verlassen wechseln können, bin ich mit einem in der Nähe der Schnipsel unten?
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' erstreckt' MongoUserDb' die 'MongoDatabase' erstreckt, die' Database' erstreckt. Irgendwo in dieser Hierarchie muss es eine Implementierung von 'find' geben (weil' EmailServiceImpl' nicht abstrakt ist). Es hat nichts mit den Anmerkungen vom Typ selbst oder dem Kuchenmuster zu tun. – Jesper
Ich verstehe .. Ich lerne nur dieses Thema und der Blog war nicht so klar (zumindest für mich). – Killyz
Hast du einen Blick auf den Code geworfen, den ich gepostet habe? Das könnte deinen Zweck erfüllt haben, glaube ich. –