简体   繁体   中英

inheritance and event handlers c#

Ok guys I'm totally new to stackoverflow, let me know if I stuff something up.

I am making a class library for sockets and then using the class library to make a server. The issue I've run into is this:

In the class library I have a class called sockets that has event handlers (you know like connection made, closed so on) and in the server I'm making, I have a class named player which inherits from sockets .

The problem pretty much comes down to this. I use the OnConnectionMade event handler to create my player , but because I cant do instanceOfInheritedClass = intanceOfBaseClass , even when I make use of use of the event handlers, the event handlers wont trigger because instanceOfInheritedClass isn't pointing to intanceOfBaseClass event, if I pass through the parameters.

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;
}

One of the solutions I came up with was that instead of inheriting, I can just make it a intanceOfBaseClass parameter in the player class. But that will prevent me from making proper use of object source from my event handlers which will mean I'll need to use linq or something to find the player from the socket or something like that.

The other thing I thought about doing was somehow passing the event handlers over, which you can see I tried, but don't know how to do.

Now after hours of looking it up I'm stuck. Any help is greatly appreciated and any answer that solves this issue is fine. I'm not picky with how its solved.

Despite that your Player class is inherited from DDSocket , but in this scenario, it acts as the wrapper class of DBSocket , so there is one hack to achieve that, I think you have to do some further steps:

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();
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM