【发布时间】:2021-02-20 06:28:49
【问题描述】:
如何在 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 {
....
}
我的内部接口只是外部接口的细分:
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。
【问题讨论】:
-
是什么阻止您简单地将
, ExternalInterface添加到此类正在实现的接口上? -
@Tenfour04,嗯,所以你的意思是我补充说,因为这个类现在有两个具有相同方法的接口,它们都是因为单一定义而被处理的?我的意思是,它可以工作,只是不确定,为两个接口 API 提供一个实现方法是一个好习惯。
-
由于它已经实现了 ExternalInterface 所需的所有方法签名,如果您声明它,它也满足该接口。就个人而言,我倾向于避免接口方法之间的签名重叠,因为我认为这很可能容易出错。但在这种情况下,您的其他接口是内部的,您可以将它们记录为纯粹用于委派一部分 ExternalInterface。
-
如果它们不必是内部的,您可以让 ExternalInterface 扩展其他两个接口以避免重叠方法签名的歧义。
-
@Tenfour04,是的,就我而言,我不能将它们放在外部,因为它具有外部接口包所没有的依赖变量。