2010-02-25 5 views
6

제 질문은 간단하지만 원하는 방식으로 코드를 구현하는 방법을 찾지 못했습니다. 그래서 구현하고자하는 코드가 좋지 않은지 궁금해하기 시작했습니다. 그리고 그것이 있다면, 그것을하는 가장 좋은 방법은 무엇입니까. 여기C#에서 정수 상수로 enum 사용하기

은 간다 :

에 가장 적합한 오버로드 된 메서드에 일치 'InputManager.Add (USHORT, 키)'

class InputManager 
{ 
    SortedDictionary<ushort,Keys> inputList = new SortedDictionary<ushort,Keys>(); 

    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(); 
    } 
} 

이 코드는 이러한 종류의 오류를주고, 컴파일되지 않습니다 일부 잘못된 인수를
인수를 가지고 '1': 나는를 사용하는 경우 'USHORT'

에 'RegisteredInput'에서 변환 할 수 없습니다 manager.Add((ushort)RegisteredInput.Up, Keys.Q);처럼 캐스트하면 효과가 있습니다. 하지만 캐스트가 명시해야하기 때문에 C#에서 C#과 같은 코드를 권장하지 않는지 궁금 해서요. 더 좋은 방법이 있다면 (많이 쓰지 않는 모든 값에 const ushort을 사용하는 것과 같습니다.).

내가 지금까지 얻은 가장 좋은 대답은 this thread 이었지만 해킹처럼 들립니다. 걱정이됩니다.

감사합니다.

+5

사전이 'Dictionary '로 정의되지 않은 이유는 무엇입니까? 또한, 당신이 일에 대해 물어볼 때 웹 사이트에 오류 메시지와 코드를 다시 입력하는 것을 피하십시오. 우리가 끊어 버리게 될 잘못된 일을 할 기회가 있습니다. 마찬가지로 ... 예외 메시지가 실제로 메소드에 "Addd"의 이름을 3d로 지정 했습니까? 실제로 사용 된 실제 코드를 복사하고 다른 문제가있는 단순화 된 문자를 다시 입력하지 않도록 어떻게 신뢰할 수 있습니까? –

+0

반복 된 키가 필요 없기 때문에. 오류 메시지에 대해서는 다시 입력하지 않았으며 관련이없는 네임 스페이스를 많이 삭제했습니다. 나는 영어가 아니기 때문에 메서드의 실제 이름도 변경했습니다. –

+0

"반복 된 키"가 무슨 뜻인지 이해하지 못합니다. 당신은 정교 할 수 있습니까? –

답변

7

InputManager를 제네릭 형식으로 만듭니다. IE는 :

public static class RegisteredInput { 
    public const ushort Up = 0; 
    public const ushort Down = 1; 
    public const ushort Confirm = 2; 
} 
+0

니스! 너무 단순하지만 아직 내 마음에 오지 않았다. 나는이 해결책으로 갈 것이라고 생각한다. 감사! –

5

암시 적 캐스트가 열거 형에 필요한 나는이 추천? 그것이 int 일 필요가있는 이유가 있습니까?

public void add(RegisteredInput id, Keys key) {...} 

또한, 옆으로, 일반적으로 공공에서 액세스 가능 부재 (방법, 종류 등) (즉, Add 대신 add의) 맡았다 파스칼되어야한다고 권장한다.

+0

음 ... 그럼 잠깐! 똑같아! – Pwninstein

+0

하지만 실제로이 코드를 작성하는 더 좋은 방법이라고 생각하십니까? 열거 형에 값을 자동으로 제공하는 열거 형의 기본 작업을 시뮬레이트해야한다는 사실을 좋아하지 않습니다. –

+0

내가 과거에 실행 한 많은 기술적 인 문제로 인해 최근에 Enum에서 멀어지게되었습니다.나는 정수, 문자열, 날짜 등 모든 내 상수에 대해이 연습을 사용합니다. Enum보다 조금 더 많은 작업이 있지만 많지는 않습니다. –

7

왜 그냥 당신의 열거를 사용하여 사전 정의

class InputManager<T> 
{ 
    SortedDictionary<T,Keys> inputList = new SortedDictionary<T,Keys>(); 

    public void add(T id, Keys key) {...} 
    public bool isPressed(T id) {...}  
} 
+0

케이스 파스칼에 관해서는 원래의 것입니다. 나는 그것을 여기에서 또한 교정 할 것이다. 죄송합니다! 커플 링을 피하기 위해 enum을 키로 직접 사용하고 싶지 않습니다. –

관련 문제