Tôi có một lớp học, NetworkClient như một lớp cơ sở:C#: Chuyển đổi Base Class để trẻ em Lớp
using System.IO;
using System.Net.Sockets;
using System.Threading.Tasks;
namespace Network
{
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
public class NetworkClient
{
public NetworkClient()
{
tcpClient = new TcpClient();
}
public NetworkClient(TcpClient client)
{
tcpClient = client;
}
public virtual bool IsConnected
{
get;
private set;
}
private StreamWriter writer { get; set; }
private StreamReader reader { get; set; }
private TcpClient tcpClient
{
get;
set;
}
public virtual NetworkServerInfo NetworkServerInfo
{
get;
set;
}
public async virtual void Connect(NetworkServerInfo info)
{
if (tcpClient == null)
{
tcpClient=new TcpClient();
}
await tcpClient.ConnectAsync(info.Address,info.Port);
reader = new StreamReader(tcpClient.GetStream());
writer = new StreamWriter(tcpClient.GetStream());
}
public virtual void Disconnect()
{
tcpClient.Close();
reader.Dispose();
writer.Dispose();
}
public async virtual void Send(string data)
{
await writer.WriteLineAsync(data);
}
public async virtual Task<string> Receive()
{
return await reader.ReadLineAsync();
}
}
}
Và cũng có một lớp con có nguồn gốc từ NetworkClient:
using System.Net;
namespace Network
{
using Data;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
public class SkyfilterClient : NetworkClient
{
public virtual IPAddress Address
{
get;
set;
}
public virtual int Port
{
get;
set;
}
public virtual string SessionID
{
get;
set;
}
public virtual User UserData
{
get;
set;
}
protected virtual bool Authenticate(string username, string password)
{
throw new System.NotImplementedException();
}
}
}
Vấn đề là, khi tôi cố gắng cast NetworkClient vào SkyfilterClient. Một ngoại lệ được ném, Không thể truyền đối tượng thuộc loại 'Network.NetworkClient' để nhập 'Network.SkyfilterClient'.
Có vấn đề gì với mã của tôi? Tôi thấy rằng Stream có thể được chuyển đổi thành NetworkStream, MemoryStream. Tại sao NetworkClient không thể chuyển đổi thành Skyfilter Client?
Xin chào, tôi đã thử ví dụ của bạn với một số thay đổi. Và nó đã chuyển đổi đối tượng cha mẹ thành con - nhưng nó không di chuyển bất kỳ thuộc tính cha mẹ nào đến đối tượng con. Đối với mã của tôi, tôi đã mong đợi một phương thức mà có thể chuyển đổi đối tượng cha thành con và cũng di chuyển các thuộc tính cha (các thuộc tính con sẽ là null). Bất kỳ ý tưởng ? –
@HemantTank Đặt cược tốt nhất của bạn là hỏi một câu hỏi riêng biệt một cách trung thực. Tôi đã không được duy trì một số trong những câu hỏi cũ atm. –
Cảm ơn. Bây giờ tôi đang sử dụng kỹ thuật hộp/unbox dựa trên JSON. Không hoàn hảo nhưng hoạt động tốt cho mục đích của tôi - https://stackoverflow.com/questions/8329470/convert-derived-class-to-base-class –