C#事件处理在多个级别/类中

时间:2010-04-22 06:58:45

标签: c# event-handling

我有3个班级A,B,C。

A类创建B .. B类创建C类。

C类在某些操作/操作之后使用某些数据引发事件,这些数据由B类中的事件处理程序处理。

现在我想要处理或将相同的引发事件数据传递给A类。

我知道我可以从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
       }
}

哦好的thx :) ..

编辑#2
实际上A是创建B的Form,它是SocketManager,C是发送和接收数据的实际套接字类。当C接收数据/消息时,我想在Form上显示它,即A。所以我从C-中引发了事件; B->一种。

THX

2 个答案:

答案 0 :(得分:1)

根据我之前的回答,听起来你有继承的继承:

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,B在传递到A之前再次编辑数据。

答案 1 :(得分:0)

如果您没有在B类的事件处理程序中编辑数据,那么只需让A和B两个订阅C中的事件。如果您在B中为A编辑数据,那么我会建议只使用B中的数据调用A中的标准方法。

更新: 根据您的说明,我会说只有2个事件 - 您的套接字(C)类在有数据时触发事件,您的套接字管理器(B)侦听此事件并在有此数据时触发另一个单独的事件。你的表格(A)从B听取这个事件并采取行动。这使你的意图足够清晰。