【问题标题】:inheritance and event handlers c#继承和事件处理程序 c#
【发布时间】:2015-04-11 05:29:19
【问题描述】:

好吧,伙计们,我是 stackoverflow 的新手,如果我有什么东西请告诉我。

我正在为套接字制作一个类库,然后使用该类库制作一个服务器。我遇到的问题是这样的:

在类库中,我有一个名为 sockets 的类,它具有事件处理程序(您知道连接已建立、已关闭等),在我正在制作的服务器中,我有一个名为 player 的类,它继承自sockets.

问题几乎可以归结为这一点。 我使用OnConnectionMade 事件处理程序来创建我的player,但是因为我不能做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;
}

我想出的一个解决方案是,我可以在player 类中将其设置为intanceOfBaseClass 参数,而不是继承。但这将阻止我从我的事件处理程序中正确使用对象 source,这意味着我需要使用 linq 或其他东西从 socket 或类似的东西中找到 player

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

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

【问题讨论】:

    标签: c# winforms sockets inheritance event-handling


    【解决方案1】:

    尽管您的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();
        }
    

    【讨论】:

    • 非常感谢您的回答,我在发布此内容后真的忙于更重要的事情,所以我什至没有机会研究它,非常感谢,我会回来的这一天。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-11
    • 1970-01-01
    相关资源
    最近更新 更多