Делегация класса в Котлине

Делегирование признаков описано в документах, и вопросов нет. Но как насчет делегаций?

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

Каков наилучший способ достичь этого без изменения FrameWorkClass? Очевидно, что мы не можем реализовать этот интерфейс.

Solutions Collecting From Web of "Делегация класса в Котлине"

Вы можете делегировать интерфейс только переменной, которая реализует этот интерфейс. Вы не можете делегировать непосредственно другому классу. Как заметил Дамиан; в основном упрощается:

 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

На данный момент только черты могут быть делегированы следующим образом. Если у вас есть класс, который вы хотите делегировать, я бы просто взял этот класс и извлек признак (интерфейс), включая все интересующие вас методы. Ниже приведен пример, основанный на вашем коде.

Представьте, что у вас есть эти классы:

 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 

По крайней мере, так я и сделал бы это.