如何解决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
每个人都很开心。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。