在文档中描述了特质委派,没有任何问题。但是班级代表团呢?
class FrameWorkClass // Third party class we cannot modify
class MyDerivedFrameWorkClass(c:FrameWorkClass) : FrameWorkClass by c
在不修改FrameWorkClass的情况下实现此目的的最佳方法是什么?显然我们无法让它实现我们的界面。
答案 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接口的任何实现并委托给它,因此FrameworkImpl
和FrameworkHappyDays
在实现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
至少我会这样做。