2012-06-26 42 views
0

我有这样的:如何在.net中将父类转换为子类时遇到困难?

public class ClientSession : TcpClient 
{ 
    public int SessionGUID = 0; 
} 
在服务器线程

而且某处这样的:

ClientSession client = (ClientSession)tcpListener.AcceptTcpClient(); //cast failure 

好吧,我明白,投像,右侧的对象必须是一个ClientSession的实例(也可能存储在指向基类的) 但是...在这种情况下如何构造ClientSession?

我不想做的ClientSession这样的:

public class ClientSession 
{ 
    public int SessionGUID = 0; 
    public TcpClient client; 
} 

回答

0

TcpListener.AcceptTcpClient会返回一个TcpClient对象而已。对象的类型不能在运行时更改,因此直接转换(保留对象标识和数据)是不可能的。

我认为组合(类似于你最后的代码片段)将是最好的方法。你可以通过实现自定义转换操作符使用转换语法启用转换,但我宁愿建议使用一个构造函数,这里需要一个TcpClient

public ClientSession(TcpClient client) { /* ... */ } 

,所以你可以这样做:

ClientSession client = new ClientSession(tcpListener.AcceptTcpClient()); 
+0

这是不是我想要的,而且我知道,我不能投这样的,我把它写在主要的问题,我只是寻求一种方式以某种方式投它...因为你的答案是第一个,我接受它 – Kosmos

+0

@Kosmos你不能,因为没有办法在运行时改变对象的类型。一旦你有了一个TcpClient,它就会保持一个,所以我看到的唯一解决方案是用TcpClient as字段构造一个ClientSession。 – Botz3000

0

所有ClientSessionTcpClient类型,但不是全部TcpClient都是ClientSession类型。 tcpListener.AcceptTcpClient()返回TcpClient的对象,它不能用作ClientSession。或者你可以调整你的类如下,

class ClientSession 
{ 
    public ClientSession(TcpClient client) 
    { 
     this.client = client; 
    } 
    public TcpClient client {get; set;} 
    // your stuff here... 
} 
相关问题