Я пытаюсь следовать примеру из этого блог. Я понимаю пример, но у меня проблемы с его реализацией.
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
. Что мне здесь не хватает?
Прочитав ваши комментарии, я пытаюсь реализовать то, что пытаюсь понять, на примере, который ближе к тому, что я на самом деле пытаюсь сделать.
Первый фрагмент не скомпилируется, а второй будет... В конце концов, я хочу иметь разные реализации 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"
}
}
}
EmailServiceImpl
расширяетMongoUserDb
, который расширяетMongoDatabase
, который расширяетDatabase
. Где-то в этой иерархии должна быть реализацияfind
(потому чтоEmailServiceImpl
не является абстрактным). Это не имеет ничего общего с аннотациями самостоятельного ввода или шаблоном торта. - person Jesper   schedule 12.04.2016