Mam klasy, NetworkClient jako klasy bazowej:C#: Konwersja klasy bazowej do dziecka Klasa
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();
}
}
}
I mają również klasę dziecka pochodzącego z 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();
}
}
}
Problem polega na tym, gdy próbuję rzucić NetworkClient w SkyfilterClient. Zgłoszony wyjątek, Nie można rzucić obiektu typu "Network.NetworkClient", aby wpisać "Network.SkyfilterClient".
Co jest nie tak z moim kodem? Widzę, że Stream można przekonwertować na NetworkStream, MemoryStream. Dlaczego NetworkClient nie może zostać przekonwertowany na klienta Skyfilter?
Witam, próbowałem twojego przykładu z pewną zmianą. I przekonwertował obiekt nadrzędny na obiekt podrzędny - ale nie migrował żadnej właściwości nadrzędnej do obiektu podrzędnego. Dla mojego kodu oczekiwałem metody, która konwertowałaby obiekt nadrzędny na element potomny, a także migrowała właściwości nadrzędne (właściwości podrzędne będą miały wartość NULL). Dowolny pomysł ? –
@HemantTank Najlepszym rozwiązaniem jest uczciwe pytanie w osobnym pytaniu. Nie utrzymuję niektórych z tych starszych pytań atm. –
Dzięki. Na razie używam techniki box/unbox opartej na JSON. Nie idealne, ale działa dobrze dla mojego celu - https://stackoverflow.com/questions/8329470/convert-derived-class-to-base-class –