1

Тема: Клас як колбек

Привіт.
Я зара працюю з одним сдк, котре призначене для роботи с онлайн-сервісами. І от, коли я хочу виконати якусь операцію, як то зберегти якісь дані в хмарі, або отримати дані з хмари, то я маю викликати спеціальний метод, котрий, серед різних аргументів, також, приймає екземпляр класу в якості колбеку. Виглядає це якось так

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 полів створювати під кожен тип помилки.

Як то мона зробити вишуканіше?

2

Re: Клас як колбек

А у чому проблема передати тип ексепшона обробнику? Типу такого:

class MyClass()
{
 //...
 
 public void HandleException(Exception e)
 {
  // Обробка ексепшона
 }
Подякували: FakiNyan, varkon2