特性代表團在文檔中有描述,並且沒有任何問題。但是班級代表團呢?科特林班級代表團
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