c# generi c коллекция интерфейсов не компилируется - PullRequest
0 голосов
/ 02 марта 2020

У меня проблемы с созданием коллекции моего универсального c интерфейса.

Вот мой универсальный c интерфейс:

public interface IPlayerInputHandler<out TDataStore, out TStateContext, in TPlayerInput, out TServerOutput>
    where TDataStore : DataStore
    where TStateContext : IStateContext
    where TPlayerInput : IPlayerInput
    where TServerOutput : IServerOutputPacket
{
    TDataStore DataStore { get; }
    TStateContext Context { get; }

    TServerOutput HandleInput(ushort serverTick, TPlayerInput playerInput, Guid CharacterId);
}

Вот базовый класс, который мой `PlayerInputHandler

public abstract class ServerPlayerInputHandler<TPlayerInput, TServerOutput> : IPlayerInputHandler<DataStore, StateContext, TPlayerInput, TServerOutput>
    where TPlayerInput : IPlayerInput
    where TServerOutput : IServerOutputPacket
{
    public DataStore DataStore { get; private set; }
    public StateContext Context { get; private set; }

    protected readonly ServerStateManager ServerStateManager;
    protected readonly ServerPlayersManager PlayersManager;

    protected ServerPlayerInputHandler(DataStore dataStore, StateContext context, ServerStateManager serverStateManager, ServerPlayersManager playersManager)
    {
        DataStore = dataStore;
        Context = context;
        ServerStateManager = serverStateManager;
        PlayersManager = playersManager;
    }
    public abstract TServerOutput HandleInput(ushort serverTick, TPlayerInput playerInput, Guid CharacterId);

}

И пример PlayerInputHandler:

public class AddItemInputHandler : ServerPlayerInputHandler<AddItemInput, AddItemPacket>
{
    public AddItemInputHandler(DataStore dataStore, StateContext context, ServerStateManager serverStateManager, ServerPlayersManager serverPlayersManager)
        : base(dataStore, context, serverStateManager, serverPlayersManager)
    {
    }

    public override AddItemPacket HandleInput(ushort serverTick, AddItemInput playerInput, Guid playerId)
    {
        var instanceId = Extensions.GenerateShortId();

        Context.Mutator.CharacterAddItem(playerId, playerInput.ItemId, instanceId);
        var aip = new AddItemPacket(playerInput.ItemId, instanceId, playerId, serverTick);

        return aip;
    }
}

Я хотел бы иметь возможность создать коллекцию следующим образом:

private Dictionary<PlayerInputType, IPlayerInputHandler<IPlayerInput, IServerOutputPacket, IPlayerInput, IServerOutputPacket>> _playerInputHandlers;

и возможность добавлять AddItemInputHandler в коллекцию.

Как вы можете видеть из моего универсального интерфейса c, метод, который он предоставляет, также опирается на TPlayerInput и TServerOutput и я не буду sh создавать метод, который принимает IPlayerInput или TServerOutput, потому что это может вызвать бокс и распаковку.

У вас, ребята, есть какие-либо предложения, как действовать?

1 Ответ

0 голосов
/ 11 марта 2020

Во-первых, назовите класс Addsomething - плохой способ. Я думаю.

Если честно, я не совсем понимаю, что вы хотите сделать. Тем не менее давайте попробуем немного.

Я создал класс для коллекции

> public class PlayerInputHandlers : Dictionary<
>                             PlayerInputType,
>                             IPlayerInputHandler<
>                                 IPlayerInput,
>                                 IServerOutputPacket,
>                                 IPlayerInput,
>                                 IServerOutputPacket>
>                         > {
> 
>     public void AddItemInputHandler<T, U>(T PlayerInputType, U PlayerInputHandler) 
>         where T : PlayerInputType
>         where U: IPlayerInputHandler<IPlayerInput, IServerOutputPacket, IPlayerInput, IServerOutputPacket>
>     {
>         this.Add(PlayerInputType, PlayerInputHandler);
>     } 
> 
> }

Это все мои интерфейсы

public class DataStore : IPlayerInput
public interface IPlayerInput
public interface IPlayerInputHandler<out TDataStore, out TStateContext, in TPlayerInput, out TServerOutput>
        where TDataStore : IPlayerInput
        where TStateContext : IStateContext
        where TPlayerInput : IPlayerInput
        where TServerOutput : IServerOutputPacket
public interface IServerOutputPacket : IStateContext
public interface IServerPlayerInputHandler<TPlayerInput, TServerOutput>
        where TPlayerInput : IPlayerInput
        where TServerOutput : IServerOutputPacket
public interface IStateContext
public class PlayerInputType
public abstract class ServerPlayerInputHandler<TPlayerInput, TServerOutput> : IPlayerInputHandler<DataStore, StateContext, TPlayerInput, TServerOutput>, IServerPlayerInputHandler<TPlayerInput, TServerOutput> 
        where TPlayerInput : IPlayerInput
        where TServerOutput : IServerOutputPacket
public class ServerPlayersManager
public class ServerStateManager
public class StateContext : IStateContext
...