나는 가능한지 확실하지 않은 무언가를 얻으려고하고 있으며 나는 조금 붙어있다.C#의 공분산 및 반 차분 사용법
public class Client
{
}
public class Server<ClientTemplate>
where ClientTemplate : Client
{
public virtual void ClientConnected(ClientTemplate client){}
public virtual void ClientDisconnected(ClientTemplate client){}
public virtual void MessageReceived(ClientTemplate client, Message message){}
public virtual void SendMessage(ClientTemplate client, Message message){}
}
이 클래스는 나중에 같은 다른 어셈블리에 확장됩니다 :
public class LobbyClient : Client
{
string username;
string passwordHash;
}
public class LobbyServer : Server<LobbyClient>
{
public override void ClientConnected(LobbyClient client)
{
Console.WriteLine("Client connected");
}
}
나는 동적으로로드 최초의 조립에서
나는 클라이언트와 서버라는 몇 가지 기본 유형은 다음과 같이 정의되어 내 기본 클래스가 파생 된 두 번째 클래스입니다.
Server<Client> server = Activator.CreateInstance(serverTypeInfo);
를했지만 운이없이 변환이 잘못 같이
나는 다음이 작업을 수행하기 위해 노력하고있어.나는 나중에 코드에서 이런 일을하고 싶지 : 나는 더 기본 인터페이스 IClient 및 IServer을 시도
Client client = Activator.CreateInstance(clientType) as Client;
server.ClientConnected(client);
및 클라이언트와 서버들로부터했지만 같이 템플릿 인수를 설정을 도출 작동하지.
여기 내 목표를 달성 할 수있는 방법이 있습니까?
Player.IO (현재 야후 게임 네트워크)가이 작업을 관리하고 있지만 컴파일 된 어셈블리를보고 코드가 어떻게 작동하는지 알 수 없습니다.
https://gamesnet.yahoo.net/documentation/services/multiplayer/serverside
편집 :
IServer<IClient> server = Activator.CreateInstance(serverTypeInfo);
당신에게
감사 : 코드의public interface IClient
{
}
public class Client : IClient
{
}
interface IServer<in ClientTemplate> where ClientTemplate : IClient
{
void ClientConnected(ClientTemplate client);
void ClientDisconnected(ClientTemplate client);
void MessageReceived(ClientTemplate client, Message message);
void SendMessage(ClientTemplate client, Message message);
}
public class Server<ClientTemplate> : IServer<ClientTemplate>
where ClientTemplate : IClient
{
public virtual void ClientConnected(ClientTemplate client){}
public virtual void ClientDisconnected(ClientTemplate client){}
public virtual void MessageReceived(ClientTemplate client, Message message){}
public virtual void SendMessage(ClientTemplate client, Message message){}
}
그리고 이상을 : 여기
내가 시도 인터페이스 버전입니다
'IServer 여기서 TClient : IClient'를 사용하셨습니까? 시도한 인터페이스 코드를 게시하십시오. –
나는 그것을 시도했다. 나는 인터페이스를 사용해 보았을 때 코드가 보이는 방식을 정확하게 게시했다. – Sanctus2099
이것을 달성하기 위해'DoubleDispatch'를 사용할 수 있습니다 ...하지만 문제는 ...'Client'와'Server'는 좋은 기본 클래스가 아닙니다. 그것들은 추상적이지만, Liskov와 호환되지 않습니다. 상속의 다른 코드 재사용 개념 (예 : AOP 또는 구성)을 사용해보십시오. – Aron