代码之家  ›  专栏  ›  技术社区  ›  George Johnston

为什么这种继承不起作用?

  •  1
  • George Johnston  · 技术社区  · 14 年前

    我有一个派生自TcpClient的类,例如。

    class ZClient : TcpClient
    {
        public byte[] Buffer { get; set; }
        public Queue<byte[]> Queue {get; set;}
    }
    

    以及创建TcpClient的方法

    ...
    
    TcpListener listener = ar.AsyncState as TcpListener;
    ZClient client = listener.EndAcceptTcpClient(ar) as ZClient;
    

    当我强制转换listener.EndAcceptTcpClient(ar)时,对象“client”为空,后者通常返回TcpClient作为ZClient。我想做的是违法的吗?

    更新 :是否可以将ZClient基类的属性设置为等于通过构造函数传入的TcpClient,以避免必须有其他属性来引用TcpClient?例如

    public ZClient(TcpClient client)
    {
       base = client;  // I'm aware this doesn't work.
    }
    
    6 回复  |  直到 14 年前
        1
  •  1
  •   Marco    14 年前

    您可能希望TcpClient和ZClient之间的关系是“has a”而不是“is a”

    class ZClient
    {
        public ZClient(TcpClient client) 
        {
            this.client = client;
        }
        public TcpClient client {get; set;}
        public byte[] Buffer { get; set; }
        public Queue<byte[]> Queue {get; set;}
    }
    

    然后可以将调用委托给底层TcpClient

        2
  •  6
  •   KeithS    14 年前

    因为它是向后的。TcpClient不包含缓冲区或队列,因为它不是ZClient。苹果是水果,但并非所有的水果都是苹果。

    您需要某种显式转换。您可以提供接受TcpClient的ZClient构造函数,或者在TcpClient上提供返回ZClient的扩展方法。这可能需要将ZClient设置为TcpClient的包装类,而不是ZClient的子类。

        3
  •  4
  •   jason    14 年前

    全部 ZClient TcpCplient 但不是全部 TcpClient s是 Z客户 s公司 . 这个 TCP客户端 TcpListener.EndAcceptTcpClient 是一个 不能用作 Z客户 TCP客户端 . 我建议用一个

    private readonly TcpClient;
    public ZClient(TcpClient tcpClient) {
        this.tcpClient = tcpClient;
    }
    

    :也许另一个例子会有所帮助

    class Animal { }
    class Cat {
        public int NumberOfLives { get; private set; }
        public Cat() { NumberOfLives = 9; }
    }
    

    as )返回 Animal Cat ? 不是全部 我们有脚就像不是所有人一样 TCP客户端 byte[] 命名的 Buffer 或者 Queue<byte[]> Queue . 因此,你不能认为 作为一个 就像你想不出一个通用的 作为一个

        4
  •  0
  •   Tim Robinson    14 年前

    我想做的是违法的吗?

    对。怎么可能 TcpListener 知道怎么想出一个 ZClient Buffer Queue 房产是吗?

        5
  •  0
  •   cdhowie    14 年前

    listener.EndAcceptTcpClient(ar) TcpClient . 你不能接受 TCP客户端 假装这是 ZClient

    简而言之:

    • Z客户 s是 根据定义。
    • 不是全部 TCP客户端 s是 s。

        6
  •  0
  •   RationalGeek    14 年前

    如果您从侦听器获取TcpClient,那么侦听器将像往常一样返回一个TcpClient。你永远不会有新的客户。TcpListener对您的新类一无所知,因此无法创建它。如果您只想拥有一个向TcpClient添加功能的对象,那么您可能只想使用组合而不是继承。简单地说,ZClient通过在内部存储TcpClient来包装TcpClient,并添加您想要的任何功能。