Kotlin多接口委托

问题描述

如何有效地在Kotlin中编写委派?

我有以下问题:

我正在向客户公开一个接口。我们称之为ExternalInterface

interface ExternalInterface {
  fun fun1()
  fun fun2()
  fun fun3()
  fun fun4()
}

我在没有委派的情况下在我的程序包中实现了此操作,

class Impl(
   obj1: InternalInterface1,obj2: InternalInterface2
): ExternalInterface {
     override fun fun1() = obj1.fun1()
     override fun fun2() = obj1.fun2()
     override fun fun3() = obj2.fun3()
     override fun fun4() = obj2.fun4()
}

这是因为按某些内部分类功能进行分组比较容易,所以我可以得到如下内容

class RelatedStuff : InternalInterface1 {
  ....
}

class OtherRelatedStuff : InternalInterface2 {
  ....
}

我的内部接口只是externalInterface的细分:

interface InternalInterface1 {
   fun fun1()
   fun fun2()
}

interface InternalInterface2 {
   fun fun3()
   fun fun4()
}

是否可以在这里以我的客户仍然可以依赖ExternalInterface的方式使用委托,但是我可以清理Impl代码

有效地,我想我想到达某个地方:

class Impl(
   obj1: InternalInterface1,obj2: InternalInterface2
): InternalInterface1 by obj1,InternalInterface2 by obj2

但也希望它实现ExternalInterface

解决方法

您可以简单地创建第3个接口(在我的示例中为Facade)并使Impl也实现它:

interface InternalInterface1 {
   fun fun1()
   fun fun2()
}

interface InternalInterface2 {
   fun fun3()
   fun fun4()
}

interface Facade : InternalInterface1,InternalInterface2

class Impl(
   obj1: InternalInterface1,obj2: InternalInterface2
): InternalInterface1 by obj1,InternalInterface2 by obj2,Facade

尽管这种设计对我来说似乎有点奇怪。我通常要做的是,有一堆外部接口(我称它们为API)和一些扩展API接口的内部接口:

interface ExternalInterface1 {
    fun fun1()
}

interface ExternalInterface2 {
    fun fun2()
}

interface InternalInterface1 : ExternalInterface1 {
    fun fun3()
}

interface InternalInterface1 : ExternalInterface2 {
    fun fun4()
}

interface ExternalAPI: ExternalInterface1,ExternalInterface2

interface InternalAPI: InternalInterface1,InternalInterface2

class Impl: InternalAPI {
    obj1: InternalInterface1,obj2: InternalInterface2
}: InternalAPI,InternalInterface1 by obj1,InternalInterface2 by obj2

通过这种方式,您的外部接口是原始的,但是您仍可以使用InternalAPI使用一些内部接口。然后,您可以添加如下内容:

/**
 * Exposes the internal API of [ExternalAPI]. Note that all methods exposed this
 * way are subject to change!
 */
fun asInternal(): InternalAPI = this

每个人都很开心。