Паттерн делегирование/декоратор с изменяемым делегатом
От: Quadri  
Дата: 25.02.19 13:50
Оценка:
В приложении есть объект MusicPlayer реализующий интерфейс Player и проигрывающий музыку.
Встала необходимость проигрывать музыку транслируя ее в chromecast, для чего существует класс CastPlayer, реализующий тот же самый интерфейс Player. Таким образом надо иногда работать с 1м объектом, иногда (при включении трансляции) переключаться на объект второго класса.
Я, имея возможность юзать Kotlin и решив что самый умный, попробовал реализовать паттерн декоратор(или делегирование, не суть) удобным средством языка — https://kotlinlang.org/docs/reference/delegation.html, таким образом
class ExoPlayerCastAwareDecorator(private val exoPlayer : Player,
                                  private val castPlayer : Player,
                                  private var currentPlayer : Player) : Player by currentPlayer {
        ...

    private fun setCurrentPlayer(newCurrentPlayer : Player) {
            if(newCurrentPlayer == currentPlayer) {
                return;
            }
            currentPlayer.stop(true)
            currentPlayer = newCurrentPlayer
        ...    
    }
}

Предполагалось что просто поменяю класс 1го объекта (MusicPlayer) без изменения его использования во всех местах, т.к. новый класс прикидывается тем же Player. И в нужные моменты внутри просто будет меняться делегат. Однако котлин при таком раскладе объявляет поле делегата final, все методы всегда делегируются первому объекту, т.е. изменения currentPlayer в методе setCurrentPlayer() ни на что не влияют.
Красоты не получилось.

Есть ли какие то другие варианты кроме ручного имплементирования всех методов интерфейса Player с прямым вызовом методов currentPlayer?

А в других языках?
kotlin
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.