【问题标题】:Class delegation in KotlinKotlin 中的类委托
【发布时间】:2014-10-20 18:48:35
【问题描述】:

文档中描述了特征委托,并且没有问题。但是类委托呢?

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

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

【问题讨论】:

  • 注意,Kotlin 中的 trait 已重命名为 interface
  • 我添加了一个答案来尝试澄清情况,除了@damien 所描述的内容或我的轻微变化之外,没有其他选择。

标签: kotlin


【解决方案1】:

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

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

或者你可以笼统地说:

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

接受框架接口的任何实现并将其委托给它,因此FrameworkImplFrameworkHappyDays 如果它们实现了Framework 接口,它们都可以工作。

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

【讨论】:

  • 看起来这是将委托类的选择委托(双关语)给消费者。幸运的是,还有一个替代方案:class MyDerivedFrameworkClass : Framework by FrameworkImpl() {...}
【解决方案2】:

目前只有特质可以这样委派。如果您有一个想要委托的类,我会简单地采用该类并提取一个特征(接口),包括您感兴趣的所有方法。这是一个基于您的代码的示例。

想象一下你有这些类:

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

至少我会这样做。

【讨论】:

  • 实际上它没有帮助,并且在当前版本的 Kotlin 中是不可能的。我需要的是:一些 api 为我提供了 FrameWorkClass,我想将其委托给我的 MyDerivedFrameWorkClass。在您的解决方案中,我必须委托FrameWorkClassImpl,它应该被包装在 api 提供的类之上。
  • 我有点不清楚你需要什么。您能否为您的问题添加更多详细信息?关于 Kotlin 的可能性,我已经尝试过这段代码,它在当前的 Kotlin 版本中对我有用。
猜你喜欢
  • 2015-09-03
  • 2018-05-07
  • 2018-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-28
  • 2019-09-08
相关资源
最近更新 更多