scala自我类型是否可以通过委派来满足?
假设我有(这是相当做作的) 有没有办法避免在new Query()创建中出现冗余的“override val dbName=self.dbName,override val dbHost=self.dbHost”,而是指示新查询对象应该从这些字段的HasADbConnection实例继承/委托到该实例scala自我类型是否可以通过委派来满足?,scala,delegation,implicits,self-type,Scala,Delegation,Implicits,Self Type,假设我有(这是相当做作的) 有没有办法避免在new Query()创建中出现冗余的“override val dbName=self.dbName,override val dbHost=self.dbHost”,而是指示新查询对象应该从这些字段的HasADbConnection实例继承/委托到该实例 我意识到,对于查询来说,将DbConnection作为构造函数参数可能更合适。不过,我对满足查询self类型的其他方式感兴趣。可能无法将HasADbconnection字段传播到新的查询实例上,这
我意识到,对于查询来说,将DbConnection作为构造函数参数可能更合适。不过,我对满足查询self类型的其他方式感兴趣。可能无法将HasADbconnection字段传播到新的查询实例上,这是一个完全有效的答案。不确定您到底想做什么,但这似乎符合您的意图:
trait C extends B {
def myA = new A() with C { // Note that this could be "with B" rather than "with C" and it would still work.
val name: String = C.this.name // explicit type not actually required - String type can be inferred.
}
}
然后,例如:
scala> val myC = new C() { val name = "myC-name" }
myC: C = $anon$1@7f830771
scala> val anA = myC.myA
anA: A with C = C$$anon$1@249c38d5
scala> val aName = anA.name
aName: String = myC-name
希望这至少有助于指导您最终的解决方案。如果你进一步明确你想做什么(或为什么要做),你可能会提供进一步的帮助
编辑-更新问题后:
我建议你可能想得不对。我不想把查询类束缚在知道如何建立连接上。相反,可以将一个现成的连接作为参数传递给使用该连接的调用,或者(如下所示)设置查询类以提供从连接到结果的函数,然后使用在别处建立的连接调用该函数
下面是我如何解决这个问题的想法(请注意,这个示例本身并没有创建实际的DB连接,我只是从表面上看您的DbConnection类型-实际上您已经定义了“DbConnConfig”类型):
不确定您到底想做什么,但这似乎与您的意图相符:
trait C extends B {
def myA = new A() with C { // Note that this could be "with B" rather than "with C" and it would still work.
val name: String = C.this.name // explicit type not actually required - String type can be inferred.
}
}
然后,例如:
scala> val myC = new C() { val name = "myC-name" }
myC: C = $anon$1@7f830771
scala> val anA = myC.myA
anA: A with C = C$$anon$1@249c38d5
scala> val aName = anA.name
aName: String = myC-name
希望这至少有助于指导您最终的解决方案。如果你进一步明确你想做什么(或为什么要做),你可能会提供进一步的帮助
编辑-更新问题后:
我建议你可能想得不对。我不想把查询类束缚在知道如何建立连接上。相反,可以将一个现成的连接作为参数传递给使用该连接的调用,或者(如下所示)设置查询类以提供从连接到结果的函数,然后使用在别处建立的连接调用该函数
下面是我如何解决这个问题的想法(请注意,这个示例本身并没有创建实际的DB连接,我只是从表面上看您的DbConnection类型-实际上您已经定义了“DbConnConfig”类型):
scala> val hasConn = new HasADbConnection("myDb", "myHost")
hasConn: HasADbConnection = HasADbConnection@6c1e5d2f
scala> hasConn.doSomething(new Query("@"))
res2: String = myDb-@-myHost