特性代表团在文档中有描述,并且没有任何问题。但是班级代表团呢?科特林班级代表团
class FrameWorkClass // Third party class we cannot modify
class MyDerivedFrameWorkClass(c:FrameWorkClass) : FrameWorkClass by c
什么是最好的方式来实现这一点,而无需修改FrameWorkClass?显然,我们无法实现我们的界面。
特性代表团在文档中有描述,并且没有任何问题。但是班级代表团呢?科特林班级代表团
class FrameWorkClass // Third party class we cannot modify
class MyDerivedFrameWorkClass(c:FrameWorkClass) : FrameWorkClass by c
什么是最好的方式来实现这一点,而无需修改FrameWorkClass?显然,我们无法实现我们的界面。
此刻只有特质可以像这样委托。如果你有一个你想委派的类,我会简单地带上这个类并提取一个特征(界面),包括你感兴趣的所有方法。下面是一个基于你的代码的例子。
想象一下,你有这些类:
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提供的类之上。 – naixx 2014-12-16 17:43:24
这对我而言有点不清楚你需要什么。你能否为你的问题添加更多细节?关于Kotlin的可能性,我已经试过这段代码,它在当前的Kotlin版本中对我有用。 – 2014-12-17 06:17:21
您只能将接口委托给实现该接口的变量。你不能直接委托给另一个班级。正如@Damian指出的那样;基本上简化为:
interface Framework {}
class FrameWorkImpl: Framework {}
class MyDerivedFrameWorkClass(val fw: FrameWorkImpl) : Framework by fw {}
或者你可以笼统说:
class MyDerivedFrameWorkClass(val fw: Framework) : Framework by fw {}
接受框架接口的任何实现,并且如果实施委托给它,所以FrameworkImpl
和FrameworkHappyDays
都工作Framework
接口。
此更新为当前科特林,其中trait
已更名为interface
看起来这是委托(双关意图)委托类的选择给消费者。幸运的是,还有一种替代方法:由FrameworkImpl(){...}创建的类MyDerivedFrameworkClass:Framework。 – 2016-11-23 14:30:23
注意到,'trait'在科特林已更名为'interface' – 2015-12-31 00:46:08
我添加了一个答案,试图弄清情况,没有除了@ Damien描述的东西或我的微小变化之外的另一种选择。 – 2015-12-31 00:54:22