Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
scala自我类型是否可以通过委派来满足?_Scala_Delegation_Implicits_Self Type - Fatal编程技术网

scala自我类型是否可以通过委派来满足?

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字段传播到新的查询实例上,这

假设我有(这是相当做作的)

有没有办法避免在new Query()创建中出现冗余的“override val dbName=self.dbName,override val dbHost=self.dbHost”,而是指示新查询对象应该从这些字段的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