2014-10-20 46 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