我正在尝试遵循此博客中的示例。我理解这个例子,但在实施它时遇到了麻烦。
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 trait 没有要求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"
}
}
}