Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/kotlin/3.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
Kotlin:委托给具有相同实现的多个接口 情况/问题_Kotlin_Interface_Delegates - Fatal编程技术网

Kotlin:委托给具有相同实现的多个接口 情况/问题

Kotlin:委托给具有相同实现的多个接口 情况/问题,kotlin,interface,delegates,Kotlin,Interface,Delegates,我想通过kotlin扩展一个具有良好委派特性的库,但是我被困在了一个地方,我想将两个不同的接口委派给同一个IML。问题是,这两个接口有共同的方法(一个扩展另一个) 图书馆我不能换 因此有一个Base接口,它由ExtendedBase和Foo1接口扩展。一个实现了Foo和ExtendedBase的Foo1Impl,实际上库中有很多类似的实现和接口 接口基础:{ 有趣的故事() 趣味多巴斯基2() //…很多方法 有趣的多巴森() } 接口ExtendedBase:Base{ 有趣的事 fun do

我想通过kotlin扩展一个具有良好委派特性的库,但是我被困在了一个地方,我想将两个不同的接口委派给同一个IML。问题是,这两个接口有共同的方法(一个扩展另一个)

图书馆我不能换 因此有一个
Base
接口,它由
ExtendedBase
Foo1
接口扩展。一个实现了
Foo
ExtendedBase
Foo1Impl
,实际上库中有很多类似的实现和接口

接口基础:{
有趣的故事()
趣味多巴斯基2()
//…很多方法
有趣的多巴森()
}
接口ExtendedBase:Base{
有趣的事
fun doExtended2()
//…很多方法
fun doExtendedN()
}
接口1:Base{
乐多福1()
}
类Foo1Impl:Foo1,ExtendedBase{
//对于doBase、doExtended和doFoo1,有些是impl
}
接口2:Base{
乐多福2()
}
类Foo2Impl:Foo2,ExtendedBase{
// ...
}
// ... 许多接口和impl
接口FooN:Base{
fun doFooN()
}
类FooNImpl:FooN,ExtendedBase{
// ...
}
该库的扩展(这是我想做的) 我想扩展这个库,并创建我自己的接口来扩展
ExtendedBase
Foo[1..N]
的功能:


接口FooBar1:Foo1{
有趣的doFooBar1()
}
类FooBar1Impl
构造函数(impl:T):FooBar1,通过impl扩展数据库,通过impl扩展Foo1
其中T:Foo1,T:ExtendedBase
{
重写fun doFooBar1(){
println(“foobar1”)
}
}
//.. 许多其他的扩展,比如FooBar[2..N],都用相同的逻辑扩展了基
这些扩展会抱怨
继承了它的多个实现
,因为
Foo1
ExtendedBase
extend
Base
。但实际上它很容易确定,因为只有一个实现可以委托给:
impl:T

我想的那些可行/不可行的事情 1。多接口实现的语法(kotlin中不存在)

如果有多接口实现的语法,可能是这样的:

class FooBar1Impl
构造函数(impl:T):FooBar1(ExtendedBase,Foo1)
其中T:Foo1,T:ExtendedBase
{ /* ... */ }
2。继承typeparameter声明(jvm不可能)

如果jvm有可能的话,我们可以写这样的东西,但事实并非如此:

class FooBar1Impl
构造函数(impl:T):FooBar1,T by impl
其中T:Foo1,T:ExtendedBase
{ /* ... */ }
3。几乎可能:可以扩展的基本对象(仍然有问题)

开放类BaseExtension构造函数(impl:Base):按impl基
@抑制(“委托成员隐藏超类型覆盖”)
类FooBar1Impl
构造函数(impl:T):BaseExtension(impl),FooBar1
其中T:Base,T:ExtendedBase
但在这里,你可以看到被抑制的警告是问题所在

4。决定默认impl的语法(kotlin中不存在)

class FooBar1Impl
构造函数(impl:T):FooBar1,[default]ExtendedBase by impl,Foo1 by impl
其中T:Foo1,T:ExtendedBase{/*..*/}
问题: 是否有任何工作流可以避免我手动覆盖所有
Base
方法?或者任何其他使这种扩展成为可能的解决方案?


想象一下,
Base
有类似的
100
方法,我需要手动覆盖。

好的,我想我现在可能已经找到了一个解决方案:

首先,我将创建一个基本扩展类结构,它将来自以下两个方面的方法委托给相同的构造函数属性:
base
BaseExtension
。我需要/想要取消对此的警告

出现警告是因为kotlin无法看到超类方法都被委托给相同的实现
impl
,而此实现将覆盖方法委托给:

开放类基扩展
构造函数(private val impl:T):按impl的基
@抑制(“委托成员隐藏超类型覆盖”)
开放类扩展
构造函数(private val impl:T):BaseExtension(impl),按impl扩展based
其中T:Base,T:ExtendedBase{
}
然后,对于每个显式扩展,我将对这个
扩展
进行子类化,并实现显式扩展接口,如下所示:

接口FooBar1:Foo1{
有趣的doFooBar1()
}
@抑制(“委托成员隐藏超类型覆盖”)
类FooBar1Impl
构造函数(私有val impl:T):FooBar1,扩展(impl),Foo1 by impl
其中T:Base,T:ExtendedBase,T:Foo1
{
fun doFooBar(){/*..*/}
}
最后,这不是一个非常简洁的解决方案,但至少没有错误,我不必再次实现任何已经实现的方法。虽然这个警告仍然让我感到不安,但我看不出有什么办法可以绕过它


如果有人的解决方案不包含这些需要抑制的警告,那就太好了。