Intereting Posts
Включение страницы входа для весны Сервер авторизации / ресурсов Дооснащение + десериализация GSON + отношение к царству Невозможно обновить фрагменты в FragmentPagerAdapter Коллекции Kotlin бросают ClassNotFoundException на Android Шаблон Nullable var внутри строки Архитектура собственного SDK – API асинхронного метода в Котлине ListView может отображаться в Activity, но не может отображаться в фрагменте Регулярное изображение Котлин Установить значение поля без вызова метода set – Kotlin Как преобразовать / преобразовать коллекцию в другую коллекцию по свойству элемента? Kotlin: цикл через отфильтрованный (возможно, пустой и не более одного элемента) список Я пытаюсь играть музыку с SDcard Преобразование Kotlin SAM с частным внутренним интерфейсом Java? Ошибка ввода типа. Попробуйте указать тип аргументации: Kotlin Каковы наилучшие методы для «обрезки» исключения stacktrace перед регистрацией с помощью SLF4J?

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

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

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 

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