2014-10-20 74 views
0

特性代表团在文档中有描述,并且没有任何问题。但是班级代表团呢?科特林班级代表团

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

什么是最好的方式来实现这一点,而无需修改FrameWorkClass?显然,我们无法实现我们的界面。

+0

注意到,'trait'在科特林已更名为'interface' – 2015-12-31 00:46:08

+0

我添加了一个答案,试图弄清情况,没有除了@ Damien描述的东西或我的微小变化之外的另一种选择。 – 2015-12-31 00:54:22

回答

0

此刻只有特质可以像这样委托。如果你有一个你想委派的类,我会简单地带上这个类并提取一个特征(界面),包括你感兴趣的所有方法。下面是一个基于你的代码的例子。

想象一下,你有这些类:

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 

至少这是我会怎么做。

+0

实际上这并没有帮助,在当前版本的Kotlin中将不可能。我需要的是:一些API为我提供'FrameWorkClass',我想委托给我的'MyDerivedFrameWorkClass'。在你的解决方案中,我必须委派'FrameWorkClassImpl',它应该被包装在API提供的类之上。 – naixx 2014-12-16 17:43:24

+0

这对我而言有点不清楚你需要什么。你能否为你的问题添加更多细节?关于Kotlin的可能性,我已经试过这段代码,它在当前的Kotlin版本中对我有用。 – 2014-12-17 06:17:21

2

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

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

或者你可以笼统说:

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

接受框架接口的任何实现,并且如果实施委托给它,所以FrameworkImplFrameworkHappyDays都工作Framework接口。

此更新为当前科特林,其中trait已更名为interface

+0

看起来这是委托(双关意图)委托类的选择给消费者。幸运的是,还有一种替代方法:由FrameworkImpl(){...}创建的类MyDerivedFrameworkClass:Framework。 – 2016-11-23 14:30:23