多态性:传递派生类会变成null吗?

时间:2018-08-12 13:10:42

标签: c# polymorphism conceptual

我有两个类:ServerOperation(抽象的)和ServerOperationDefinitions(从ServerOperation派生并定义抽象函数)。我通过一个接受ServerOperationDefinitions类型的函数传递ServerOperation,然后将经过多态转换为基类的参数传递给另一个接受ServerOperation对象的函数。但是,当我进入最终的目标类并尝试调用函数时,会抛出异常:System.NullReferenceException。但是,如果我手动将ServerOperation对象设置为新的ServerOperationDefinition,则可以完美地工作。有什么作用?

这是第一个电话:

 ServerManager.Launch(new ServerOperationDefinitions());

这是第二个电话:

public static void Launch(Object definedServerOperations)
{
    Configuration.ServerVariables.IDENTITY = new UUID();
    SocketManager serverSocket = new SocketManager(Configuration.ServerVariables.PORT, definedServerOperations);
}

最终目的地

public SocketManager(int port, Object operationDefinition)
{ 
    ClientQueueManager queueManager = new ClientQueueManager(this); 
    BeginListen(port);
    opDef = (ServerOperation)operationDefinition;
}

存储为

private ServerOperation opDef;

错误在这里

case NetObjectType.CLIENT_SERVER_RESPONSE_GENERIC:
              --->opDef.handleRespondToClient(clientState, recievedNetworkObject);

Exception thrown: 'System.NullReferenceException' in

编辑: 但是如果我在其上方执行此操作,错误功能将起作用:

opDef = new ServerOperationDefinitions();

1 个答案:

答案 0 :(得分:0)

问题在于订购错误和睡眠不足。 线程阻止了opDef的执行。 BeginListen阻塞主线程。

解决方案: 从这个

public SocketManager(int port, Object operationDefinition)
{ 
    ClientQueueManager queueManager = new ClientQueueManager(this); 
    BeginListen(port);
    opDef = (ServerOperation)operationDefinition;
}

public SocketManager(int port, ServerOperation operationDefinition)
{
    ClientQueueManager queueManager = new ClientQueueManager(this);
    opDef = operationDefinition;

    BeginListen(port);
}

贷给@Guy