У меня проблемы с созданием коллекции моего универсального 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
, потому что это может вызвать бокс и распаковку.
У вас, ребята, есть какие-либо предложения, как действовать?