继承和事件处理程序c#

时间:2015-04-11 05:29:20

标签: c# winforms sockets inheritance event-handling

好的,我是stackoverflow的新手,请告诉我是否填写了一些内容。

我正在为套接字创建一个类库,然后使用类库来创建服务器。我遇到的问题是:

在类库中,我有一个名为sockets的类,它有事件处理程序(你知道连接已经完成,关闭等等),而在我正在制作的服务器中,我有一个名为{{的类1}}继承自player

这个问题几乎归结为这个问题。 我使用sockets事件处理程序来创建我的OnConnectionMade,但因为我不能player,即使我使用事件处理程序,事件处理程序也不会触发因为{{如果我通过参数,1}}没有指向instanceOfInheritedClass = intanceOfBaseClass事件。

instanceOfInheritedClass

我提出的解决方案之一是,我可以在intanceOfBaseClass类中将其设为void hostManager_OnConnectionMade(object source, ConnectionArgs e) { Player socket = new Player(e.GetSocket()); socket.OnDataRecivedPostConvert += Socket_OnDataRecivedPostConvertLogin; } public Player(DDSocket socket) { this.Host = socket.Host; this.Socket = socket.Socket; //this.OnConnectionClosed += socket.OnConnectionClosed; //this.OnDataRecivedPostConvert += socket.OnDataRecivedPostConvert; //this.OnDataRecivedPostConvertHost += socket.OnDataRecivedPostConvertHost; } 参数,而不是继承。但是这会阻止我从我的事件处理程序中正确使用对象intanceOfBaseClass,这意味着我需要使用linq或其他东西从player中找到source或类似的东西。

我想做的另一件事是以某种方式通过事件处理程序,你可以看到我试过,但不知道该怎么做。

现在经过几个小时的查找,我被困住了。任何帮助是极大的赞赏 任何解决这个问题的答案都没问题。我对它的解决方法并不挑剔。

1 个答案:

答案 0 :(得分:0)

尽管您的Player类继承自DDSocket,但在这种情况下,它充当DBSocket的包装类,所以有一个黑客可以实现这一点,我认为你必须做一些进一步的步骤:

class DDSocket
{
    public event Action OnConnectionClosed;
    public void Raise()
    {
        if (OnConnectionClosed != null)
        {
            OnConnectionClosed();
        }
    }
}



class Player :DDSocket
{
    // make new event look as the same base class
    public new event Action OnConnectionClosed;
    public Player(DDSocket socket)
    {
        socket.OnConnectionClosed += Socket_OnConnectionClosed;
    }

    private void Socket_OnConnectionClosed()
    {
       if (OnConnectionClosed != null)
        {
            OnConnectionClosed();
        }
    }
}

// test those 2 classes
static void Main()
    {           
        DDSocket d = new DDSocket();

        Player pl = new Player(d);
          pl.OnConnectionClosed += () => MessageBox.Show("test");
        d.Raise();
    }