Kotlin 如何避免重复功能体

Kotlin 如何避免重复功能体,kotlin,Kotlin,我想编写一个助手函数来简化对服务的viewmodel调用。在这个项目使用的库中(我无法修改),有一些不同的承诺类型需要在每个函数中以相同的方式使用,唯一不同的是传递给它们的(()->单位)lambda 尽管这些承诺类型具有完全相同的成员并以相同的方式使用,但它们并不共享一个公共接口,因此为了编写此帮助器函数,在我看来,我必须重载它并复制函数体。有没有办法避免这样做 一个简单的例子: private fun myHelper(promise: PromiseTypeA | PromiseTypeB

我想编写一个助手函数来简化对服务的viewmodel调用。在这个项目使用的库中(我无法修改),有一些不同的承诺类型需要在每个函数中以相同的方式使用,唯一不同的是传递给它们的(()->单位)lambda

尽管这些承诺类型具有完全相同的成员并以相同的方式使用,但它们并不共享一个公共接口,因此为了编写此帮助器函数,在我看来,我必须重载它并复制函数体。有没有办法避免这样做

一个简单的例子:

private fun myHelper(promise: PromiseTypeA | PromiseTypeB | PromiseTypeC, cbSuccess: ()->Unit, cbFail: ()->Unit) {
    loaderBlock();
    compMan.add(promise.sub(ioScheduler).obs(uiScheduler).onSuccess(cbSuccess).onFail(cbFail))
}

实际上,我也会嵌套传递的lambda并使用它们做一些事情,使这个函数体更长,但这应该说明这种情况。PromiseTypeA、PromiseTypeB和PromiseTypeC都有相同的成员,使用方式相同,但没有共同的接口或祖先。我在参数定义中使用的OR运算符表示我希望能够执行的操作(如在TypeScript中),但我不能。如何在kotlin中实现等效功能?

kotlin对类型要求严格,不执行“duck类型”。如果不同的承诺类型没有显式实现公共接口,但恰好具有相同的成员名称,那么它们在概念上是不同的成员

因此,代码不是“重复的”(至少在Kotlin看来),因为函数调用在技术上是不同的

据我所知,没有办法让Kotlin理解您想要给这些名称赋予相同的语义(而不改变这些类型的源代码以使它们实现接口)。我认为,如果将“traits”功能添加到语言中,它将启用这类功能。

Kotlin中没有“联合类型”,因此要统一此类的使用,您需要:

  • 定义一个公共接口
  • 接口承诺{
    意思是:承诺
    乐趣:承诺
    成功的乐趣():承诺
    fun onFail():承诺
    }
    
  • 编写一些样板代码:
  • fun PromiseTypeA.toPromise()=对象:Promise{
    重写fun sub():承诺{
    this@toPromise.sub()
    还这个
    }
    覆盖乐趣obs():承诺{
    this@toPromise.obs()
    还这个
    }
    override fun onSuccess():承诺{
    this@toPromise.onSuccess()
    还这个
    }
    override fun onFail():承诺{
    this@toPromise.onFail()
    还这个
    }
    }
    //其他类型的承诺也是如此
    
    之后一切都很简单:为
    Promise
    参数类型定义助手函数

    private fun myHelper(承诺:承诺,cbSuccess:()->单位,cbFail:()->单位){
    //...
    }
    
    并称之为:

    myHelper(promiseA.toPromise(),{/*…*/},{/*…*/},{/*…*/})
    Answer在概念上是正确的,但我觉得kotlin的某些部分在某种程度上使用了这种非公共接口逻辑,例如委托不需要实现公共接口,只需要两个运算符函数,即getValue和setValue,并带有适当的参数。对于循环,它只需要给定对象中的迭代器()方法进行迭代。运算符是编译器可以理解的硬编码内容,因此它可以启用非常特定的语言功能(支持的运算符函数集是固定的,并且每个函数都与某些语言语法相关联)。恐怕没有更通用的机制可以让用户代码真正实现这种效果(但可能我只是错过了语言中的一些东西)。是否
    promise.sub()
    为所有类型的promise返回相同类型的对象?@Tenfour04否,这里列出的所有promise方法都返回带有各自类型的promise本身