Правильное изменение/переопределение методов библиотечного класса

Я использую библиотеку WebSocket Rails-Android от ararog.

Я подписываюсь на несколько каналов в цикле на основе данных, которые я получаю со стороны сервера. Я использую один и тот же WebSocketRailsDataCallback для всех каналов, и единственным отличием является имя канала. Моя проблема в том, что данные обратного вызова onDataAvailable(Object data) содержат только полученный JSON, который не содержит имени канала, и мне не удалось найти способ узнать, на каком канале был получен ответ.

Я попытался создать собственный интерфейс и класс, который расширяет WebSocketRailsDataCallback и WebSocketRailsChannel соответственно с подписью onDataAvailable(Object data, String channelName) и переопределенным методом dispatch, но переменные класса являются закрытыми, что означает, что я не могу иметь конструктор, подобный следующему, и, следовательно, не могу привести WebSocketRailsChannel к пользовательский класс:

public CustomWebSocketRailsChannel(WebSocketRailsChannel channel)
    {
        super(/*channel arguments*/);
    }

Я могу получить поля, используя getDeclaredFields() в методах, но это не помогает мне с приведением (что мне нужно, потому что метод dispatcher.subscribe возвращает базовый класс). Следующим решением, о котором я подумал, было создание полных пользовательских классов для всех соответствующих классов (диспетчер, канал, dataCallback и т. д.) вместо того, чтобы наследовать его, но это грубое решение. Другой связывается с автором библиотеки. Любая лучшая и более простая идея будет оценена.


person Neria Nachum    schedule 09.10.2015    source источник


Ответы (1)


Проблема решена; Я зашел слишком глубоко, не заметив, что могу сделать это, переопределив только DataCallback. Я создал следующий класс:

public abstract class CustomWebSocketRailsDataCallback implements WebSocketRailsDataCallback {
    public CustomWebSocketRailsDataCallback(String channel)
    {
        mChannel = channel;
    }

    public String mChannel = null;
}

Создал экземпляр этого класса, сохранил имя канала в mChannel и получил к нему доступ в onDataAvailable.

person Neria Nachum    schedule 14.10.2015