我有一个系统,它的类/接口层次 struct 分布在3个库中.它的玩具版本看起来像这样:
在库A中:
interface BaseInterface {
fun foo(): String
}
在库B中:
class Impl : BaseInterface {
override fun foo(): String {
return "foo!"
}
}
在库C中:
class SomethingUnrelated {
fun doAThing() {
val i: BaseInterface = Impl()
println(i.foo())
}
}
到现在为止还好.C库依赖于B库和A库,一切运行正常.
现在假设我发布了一个新版本的库A,并且我添加了一个具有默认实现的新方法:
interface BaseInterface {
fun foo(): String
fun newMethod(): Int = 0
}
我想将其带入C库,并将其更改为doAThing
以使用它,如下所示:
class SomethingUnrelated {
fun doAThing() {
val i: BaseInterface = Impl()
println(i.foo() + " and also " + i.newMethod())
}
}
如果我更新库C以引入新版本的库A(不涉及对库B的依赖),我会得到java.lang.AbstractMethodError
(这是可以理解的).我可以重新编译B库并同时更新A和B,但我有一些其他限制,这使得这一点很难实现.
所以我的问题是:除了重新编译B库并同时将两个库合并到C中之外,我还有其他 Select 吗?有什么Kotlin 魔法可以帮我解决我的问题吗?
谢谢你的帮助!