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

При использовании проектов связывания 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), но на самом деле это невозможно в C#.

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

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

1 ответ

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

Другие вопросы по тегам