Как взаимодействовать с методами, которые принимают простые интерфейсы в качестве параметров в закрытом 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.