使用多个委托实现一个接口

ass*_*ias 4 delegates kotlin

我需要实现一个包含大约 50 个方法的接口(外部库,我无法控制)。

我不想使用 1000 行的单个类,而是希望使用多个类来实现围绕单个功能的一些方法,并有一个委托给功能类的“主要”实现类。

这可以使用 kotlin 中的委托来完成还是我需要在主类中实现每个方法?

不使用委托系统的示例代码:

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() { ... }
}
Run Code Online (Sandbox Code Playgroud)

Adr*_*n K 5

这可能与您的做法非常相似。问题是将您的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() {}
}

Run Code Online (Sandbox Code Playgroud)

最后一步是使用 kotlins 委托语法简单地组合一个新类:

class ApiImpl : 
    Feature1 by Feature1Impl(), 
    Feature2 by Feature2Impl(), 
    ApiInterface
Run Code Online (Sandbox Code Playgroud)

或者使用构造函数参数:

class ApiImpl(feature1: Feature1, feature2: Feature2) : 
    Feature1 by feature1, 
    Feature2 by feature2, 
    ApiInterface
Run Code Online (Sandbox Code Playgroud)

请注意,您需要添加ApiInterface. 由于我们实现了所有必需的功能,因此编译器没有抱怨。