使用多个委托来实现一个接口
Use multiple delegates to implement an interface
我需要实现一个包含大约 50 个方法的接口(外部库,我无法控制它)。
我不想使用一个 class 的 1000 行代码,而是想使用几个 classes 围绕一个功能分别实现一些方法,并有一个“主要”实现 class 委托给功能 classes.
这可以在 kotlin 中使用委托来完成吗,还是我需要在主程序中实现每个方法 class?
不使用委托系统的示例代码:
class Main: ApiInterface {
private val f1 = Feature1()
private val f2 = Feature2()
override fun m1() = f1.m1()
override fun m2() = f1.m2()
override fun m3() = f2.m3()
override fun m4() = f2.m4()
}
class Feature1 {
fun m1() { ... }
fun m2() { ... }
}
class Feature2 {
fun m3() { ... }
fun m4() { ... }
}
可能和你做的很相似。
问题是将您的 Feature1
和 Feature2
声明为接口并分别实现它们:
interface Feature1 {
fun m1()
fun m2()
}
interface Feature2 {
fun m3()
fun m4()
}
class Feature1Impl() : Feature1 {
override fun m1() {}
override fun m2() {}
}
class Feature2Impl : Feature2 {
override fun m3() {}
override fun m4() {}
}
最后一步很简单,使用 kotlins 委托语法编写一个新的 class:
class ApiImpl :
Feature1 by Feature1Impl(),
Feature2 by Feature2Impl(),
ApiInterface
或者使用构造函数参数:
class ApiImpl(feature1: Feature1, feature2: Feature2) :
Feature1 by feature1,
Feature2 by feature2,
ApiInterface
请注意,您需要添加 ApiInterface
。由于我们实现了所有必需的功能,因此没有来自编译器的投诉。
我需要实现一个包含大约 50 个方法的接口(外部库,我无法控制它)。
我不想使用一个 class 的 1000 行代码,而是想使用几个 classes 围绕一个功能分别实现一些方法,并有一个“主要”实现 class 委托给功能 classes.
这可以在 kotlin 中使用委托来完成吗,还是我需要在主程序中实现每个方法 class?
不使用委托系统的示例代码:
class Main: ApiInterface {
private val f1 = Feature1()
private val f2 = Feature2()
override fun m1() = f1.m1()
override fun m2() = f1.m2()
override fun m3() = f2.m3()
override fun m4() = f2.m4()
}
class Feature1 {
fun m1() { ... }
fun m2() { ... }
}
class Feature2 {
fun m3() { ... }
fun m4() { ... }
}
可能和你做的很相似。
问题是将您的 Feature1
和 Feature2
声明为接口并分别实现它们:
interface Feature1 {
fun m1()
fun m2()
}
interface Feature2 {
fun m3()
fun m4()
}
class Feature1Impl() : Feature1 {
override fun m1() {}
override fun m2() {}
}
class Feature2Impl : Feature2 {
override fun m3() {}
override fun m4() {}
}
最后一步很简单,使用 kotlins 委托语法编写一个新的 class:
class ApiImpl :
Feature1 by Feature1Impl(),
Feature2 by Feature2Impl(),
ApiInterface
或者使用构造函数参数:
class ApiImpl(feature1: Feature1, feature2: Feature2) :
Feature1 by feature1,
Feature2 by feature2,
ApiInterface
请注意,您需要添加 ApiInterface
。由于我们实现了所有必需的功能,因此没有来自编译器的投诉。