C # Обработка событий в нескольких уровнях / классах - PullRequest
0 голосов
/ 22 апреля 2010

У меня 3 класса A, B, C.

Класс A создает B .. Класс B создает класс C.

Класс C вызывает события после некоторого действия / операции с некоторыми данными, которая обрабатывается обработчиком событий в классе B.

Теперь я хочу обработать или передать те же самые данные о возбужденных событиях в класс А.

Я знаю, что могу вызвать другое событие из класса B и обработать его в A, но есть ли лучшее способ обработки таких событий ??

Редактировать : не использование Inheritance.i даст псевдо-код ..
пожалуйста, игнорируйте синтаксис как таковой. Я сделал что-то вроде этого.

Class A
{
   B objB;
   public void init()
   {
       objB= new B();
       addeventhandler(objB);  
       objB.init();

   }    
   //Suppose handle response_objB_Event handles event raised by C
     private void handleEvent_objB_Event(string message)
     {
        doSomething(message);
     }
}

Class B
{
  C objC;
    public void init()
   {
      objC= new C();
      addeventhandler(objC);
      objC.DoOperation();
   }

   //Suppose response_objC_Event handles event raised by C
     private void handleEvent_objC_Event(string message)
     {
        //doSomething(message);
        again raise event to pass 'message' to B.
     }

     private void doSomething(string message)
      {
         //.......do something

      }
}

Class C
{
      Event evtOperationComplete;
      public void DoOperation()
      {
         //.......do something

         // after coompletion 
            OperationComplete();             
      }

      public void OperationComplete()
      {
           RaiseEvent(evtOperationComplete,message);
      }

       public void RaiseEvent(Event E,String message)
       {
              // raise/invoke event/delgate here
       }
}

О, хорошо, спасибо :) ..

Изменить # 2
На самом деле A - это форма, которая создает B, который является SocketManager, а C - фактический класс сокета, который отправляет и получает данные. Когда C получает данные / сообщение, я хочу отобразить его в форме, т.е. B-> а.

Thx

Ответы [ 2 ]

1 голос
/ 22 апреля 2010

Судя по моему предыдущему ответу, похоже, что у вас наследственная наследственность:

public class A
public class B : A
public class C : B

, в этом случае вам не следует использовать события для этого.Вместо этого используйте base для вызова каждого базового класса.

class Program
{
    static void Main(string[] args)
    {
        C c = new C();
        c.DoStuff(0);
    }
}

public class A
{
    public virtual void DoStuff(int x)
    {
        Console.WriteLine(x);
    }
}

public class B : A
{
    public override void DoStuff(int y)
    {
        y++;
        base.DoStuff(y);
    }
}

public class C : B
{
    public override void DoStuff(int z)
    {
        z++;
        base.DoStuff(z);
    }
}

В этом примере показано создание вашего класса C и его последующее редактирование данных.Эти данные затем передаются в B, который снова редактирует данные перед передачей в A.

0 голосов
/ 22 апреля 2010

Если вы не редактируете данные в обработчике событий класса B, то просто попросите оба класса A и B подписаться на событие в C. Если вы редактируете данные в B для A, то я бырекомендую просто вызвать стандартный метод в A с данными из B.

ОБНОВЛЕНИЕ: Исходя из ваших разъяснений, я бы сказал, что просто есть 2 события - ваш класс socket (C) запускает событие, когда у него есть данныеваш менеджер сокетов (B) прослушивает это событие и запускает другое отдельное событие, когда у него есть эти данные.Ваша форма (A) прослушивает это событие от B и воздействует на него.Это делает ваше намерение достаточно ясным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...