Тема: Клас як колбек
Привіт.
Я зара працюю з одним сдк, котре призначене для роботи с онлайн-сервісами. І от, коли я хочу виконати якусь операцію, як то зберегти якісь дані в хмарі, або отримати дані з хмари, то я маю викликати спеціальний метод, котрий, серед різних аргументів, також, приймає екземпляр класу в якості колбеку. Виглядає це якось так
service.GetTopNRankings(arg1, arg2, new CallBackClass());
І ось цей CallBackClass потрібно створювати самому, наслідуючись від спеціального інтерфейсу, що є частиною того сдк.
class CallBackClass : ServiceCallBack
{
public void OnSuccess(object response){}
public void OnException(Exception e){}
}
І той інтерфейс має два методи, котрі потрібно реалізувати.
Проблему заключається в тому, що дуже часто, після того, як виконається запит, я маю щось зробити з цими даними. Наприклад, внести дані в якісь текстові поля. І всі посилання на текстові поля знаходяться в класі, з котрого я викликаю отой метод.
class MyClass
{
public TextField textField;
public void Start()
{
//виклик методу сервіса
}
}
І так, як я отримую дані в тому, окремому класі, то я не маю доступу до всіх цих текстових полів. Робити ті поля статичними якось не комельфо. Тому я вирішив передавати в той, новий клас, метод, котрий приймає відповідь від серверу і робить з ним все, що треба. Ну і зрозуміло, що той метод знаходиться в початковому класі.
class MyClass()
{
public TextField textField;
public void Start()
{
service.GetTopNRankings(arg1, arg2, new CallBackClass(SetData))
}
public void SetData(object response)
{
textField.text = (string) response; // наприклад
}
class CallBackClass : ServiceCallBack
{
Action<object> _callBack;
public CallBackClass(Action<object> callBack=null)
{
_callBack=callBack;
}
public void OnSuccess(object response)
{
if(_callBack!=null)
_callBack(response);
}
public void OnException(Exception e){}
}
}
Але що, якщо мені тре робити щось з текстовими полями в разі виникнення екзепшену? Додавати ще одне поле типу Action? А якщо дія повинна залежати від типу помилки, а типів помилок існує аж 10, то це ж доведеться аж 10 полів створювати під кожен тип помилки.
Як то мона зробити вишуканіше?