好吧,伙计们,我对stackoverflow完全陌生,如果我有什么事要告诉我。
我正在为套接字制作一个类库,然后使用该类库制作一个服务器。我遇到的问题是:
在类库中,我有一个名为sockets
的类,它有事件处理程序(你知道,就像连接已建立、已关闭等),在我正在创建的服务器中,我还有一个从sockets
继承的名为player
的类。
问题几乎可以归结为这个。我使用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
。
我想做的另一件事是以某种方式传递事件处理程序,你可以看到我试过了,但不知道怎么做
现在,经过几个小时的查找,我被卡住了。非常感谢您的帮助任何解决这个问题的答案都是好的。我对它的解决方式并不挑剔。
尽管您的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();
}