Intereting Posts

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

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

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

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

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

 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 

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