Intereting Posts
Конструкторы по умолчанию Kotlin разница между забавой в компаньонном блоке объекта и вне класса в котлине? Неразрешенная ссылка: sun.misc.MessageUtils.where используя компиляцию "org.jetbrains.kotlin: kotlin-stdlib-jre7: $ kotlin_version" дать ошибку Ошибка переноса подпункта: com.android.dx.cf.code.SimException: local 0007: недействительный Ошибка «не должна быть пустой» в Kotlin Требуется функция Котлина Нет, но определяется как другой тип Класс Kotlin Custom View реализует интерфейс, который не может быть разрешен в `: app: compileDebugKotlinAfterJava`. Идентичная версия Java отлично работает Написание Realm Daos с закрытыми транзакциями Как вы выполняете выборку api? Невозможно инициализировать парсер объектов для модели. Продукты, не найдены приемлемые конструкторы Динамический бросок в Котлине Android Build Crashes после подписанной сборки Как передать значения из активности в другую деятельность в котлин Как передать массив объектов с Android на React Native?

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

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

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 

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