Как взаимодействовать с методами, которые принимают простые интерфейсы в качестве параметров в закрытом SDK с Java-привязкой?

При использовании проектов привязки Xamarin и Java результирующий проект привязки естественным образом соответствует стилю кодирования java. т.е. ожидая использования анонимных классов (для реализации простых интерфейсов обратного вызова) в качестве параметров. Вот пример java-кода:

// Field
private Player mPlayer;

SDKClass.staticMethod(oneObject, anotherObject, new InitializationObserver() { 
    @Override
    public void onInitialized(SomeClass someClass) { 
        // Calls mPlayer
    }

    @Override
    public void OnError (Java.Lang.Throwable Error)
    {
        Console.WriteLine("Error in initialization: " + Error.Message);

    }
}

Результирующий код C# также ожидает InitializationObserver в качестве третьего параметра. Однако, поскольку SDK закрыт, и я не могу изменить реализацию, единственный способ сделать это — реализовать интерфейс и его методы «переопределения» во внутреннем классе. Мне это кажется очень непрактичным.

В java я могу получить доступ к нестатическим членам из анонимного класса (например, к полю mPlayer), но на С# это невозможно.

Есть ли другой подход при создании проектов привязки Java в Xamarin, который позволяет это сделать? Есть ли лучший способ работы с сгенерированными классами?

Спасибо за помощь. Фред


person Fhl    schedule 11.04.2015    source источник


Ответы (1)


Я считаю, что нет другого способа, кроме как добавить поле Player в вашу реализацию InitializationObserver и передать его в качестве параметра конструктора (на самом деле это то, что java делает за сценой для анонимных классов). Иногда, когда вам нужен только один метод, вы можете реализовать метод-оболочку или метод расширения (например, методы экземпляра) и использовать лямбда-выражение и закрытие поля для передачи реализации в реализацию интерфейса Java.

person Artur Shamsutdinov    schedule 11.04.2015