Мой вопрос довольно прост, но я не нашел способ реализовать мой код путем, я хочу, чтобы он был. Таким образом, я начал задаваться вопросом, не ли код, который я хочу реализовать, хорош. И если это, что лучший способ состоит в том, чтобы сделать это.
Здесь это идет:
class InputManager
{
SortedDictionary inputList = new SortedDictionary();
public void Add(ushort id, Keys key) {...}
public bool IsPressed(ushort id) {...}
}
class Main
{
private enum RegisteredInput : ushort
{
Up,
Down,
Confirm
}
public Main()
{
InputManager manager = new InputManager();
manager.Add(RegisteredInput.Up, Keys.Q);
manager.Add(RegisteredInput.Down, Keys.A);
manager.Add(RegisteredInput.Confirm, Keys.Enter);
}
void update()
{
if(manager.IsPressed(RegisteredInput.Up)) action();
}
}
Этот код не скомпилирует, давая ошибки этого вида:
Лучший перегруженный метод соответствует для 'InputManager. Добавьте (ushort, Ключи)' имеет некоторые недействительные аргументы
Аргумент '1': не может преобразовать от 'RegisteredInput' до 'ushort'
Если я использую бросок как в manager.Add((ushort)RegisteredInput.Up, Keys.Q);
это будет работать. Но потому что бросок должен быть явным, я задавался вопросом, не рекомендуется ли, чтобы код в C# как он был в C++ и если существует лучший способ сделать его (как использование const ushort
для каждого значения, которое мне отчасти не нравится много).
Лучший ответ, который я получил до сих пор, был от этого потока, но он так походит на взлом, я волновался.
Спасибо!
Сделать InputManager общим типом. IE:
class InputManager<T>
{
SortedDictionary<T,Keys> inputList = new SortedDictionary<T,Keys>();
public void add(T id, Keys key) {...}
public bool isPressed(T id) {...}
}
Почему бы просто не определить словарь, используя ваше перечисление? Есть ли причина, по которой он должен быть int?
public void add(RegisteredInput id, Keys key) {...}
Кроме того, обычно рекомендуется, чтобы общедоступные члены (методы, типы и т. Д.) Имели паскальский регистр (другими словами, Add
вместо добавить
).
Неявное приведение необходимо для перечислений. Я рекомендую следующее:
public static class RegisteredInput {
public const ushort Up = 0;
public const ushort Down = 1;
public const ushort Confirm = 2;
}