Kotlin 科特林的班级代表团

Kotlin 科特林的班级代表团,kotlin,Kotlin,特征授权在文档中描述,没有问题。那么班级代表团呢 class FrameWorkClass // Third party class we cannot modify class MyDerivedFrameWorkClass(c:FrameWorkClass) : FrameWorkClass by c 在不修改FrameWorkClass的情况下实现这一点的最佳方法是什么?显然,我们无法让它实现我们的接口。目前,只有trait可以像这样被委托。如果您有一个想要委托的类,我只需获取该类并提取

特征授权在文档中描述,没有问题。那么班级代表团呢

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

在不修改FrameWorkClass的情况下实现这一点的最佳方法是什么?显然,我们无法让它实现我们的接口。

目前,只有trait可以像这样被委托。如果您有一个想要委托的类,我只需获取该类并提取一个trait(接口),其中包括您感兴趣的所有方法。下面是一个基于您的代码的示例

假设您有以下课程:

class FrameWorkClass {
        fun foo() {}

        fun boo() {}
    }
class MyDerivedFrameWorkClass(c:FrameWorkClass) : FrameWorkClass by c
它编译不对吗?假设您对
foo()


至少我会这样做。

您只能将接口委托给实现该接口的变量。不能直接委托给其他类。正如@Damian所指出的;基本上简化为:

interface Framework {}
class FrameWorkImpl: Framework {}
class MyDerivedFrameWorkClass(val fw: FrameWorkImpl) : Framework by fw {}
或者你可以笼统地说:

class MyDerivedFrameWorkClass(val fw: Framework) : Framework by fw {}
接受框架接口的任何实现并将其委托给它,因此
frameworkmpl
FrameworkHappyDays
如果它们实现了
Framework
接口,则这两种方法都有效


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

,实际上它没有帮助,并且在当前版本的Kotlin中不可能。我需要的是:一些api为我提供了
FrameWorkClass
,我想将其委托给我的
MyDerivedFrameWorkClass
。在您的解决方案中,我必须委托
FrameWorkClassImpl
,它应该包装在api提供的类之上。我不太清楚您需要什么。你能给你的问题补充更多细节吗?关于Kotlin的可能性,我已经尝试过此代码,并且在当前Kotlin版本中对我有效。注意,Kotlin中的
trait
已重命名为
interface
我添加了一个答案,试图澄清情况,除了@damien所描述的或我的微小变化之外,没有其他选项。看起来这是将委托类的选择委托给消费者(双关语)。幸运的是,还有一种选择:
classmyderivedframeworkclass:frameworkbyframeworkmpl(){…}
class MyDerivedFrameWorkClass(val fw: Framework) : Framework by fw {}