Kotlin的集体代表团

时间:2014-10-20 18:48:36

标签: kotlin

在文档中描述了特质委派,没有任何问题。但是班级代表团呢?

class FrameWorkClass // Third party class we cannot modify
class MyDerivedFrameWorkClass(c:FrameWorkClass) : FrameWorkClass by c

在不修改FrameWorkClass的情况下实现此目的的最佳方法是什么?显然我们无法让它实现我们的界面。

2 个答案:

答案 0 :(得分:3)

您只能将接口委托给实现该接口的变量。您不能直接委托给另一个班级。正如@Damian指出的那样;基本上简化为:

interface Framework {}
class FrameWorkImpl: Framework {}
class MyDerivedFrameWorkClass(val fw: FrameWorkImpl) : Framework by fw {}

或者你可以一般说:

class MyDerivedFrameWorkClass(val fw: Framework) : Framework by fw {}

接受Framework接口的任何实现并委托给它,因此FrameworkImplFrameworkHappyDays在实现Framework接口时都能正常工作。

这已更新为当前的Kotlin,其中trait已重命名为interface

答案 1 :(得分:-1)

目前只有特征可以这样委托。如果你有一个你想要委派的类,我只需要获取该类并提取一个特征(接口),包括你感兴趣的所有方法。这是一个基于你的代码的例子。

想象一下,你有这些课程:

class FrameWorkClass {
        fun foo() {}

        fun boo() {}
    }
class MyDerivedFrameWorkClass(c:FrameWorkClass) : FrameWorkClass by c

它编译不对吗?我们假设您对foo()

感兴趣
trait FrameWorkTrait {
    fun foo() {}
}
class FrameWorkClassImpl: FrameWorkTrait {
    override fun foo() {}

    fun boo() {}
}
class MyDerivedFrameWorkClass(c:FrameWorkTrait) : FrameWorkTrait by c

至少我会这样做。