2011-05-16 6 views
1

제네릭에 문제가 있습니다. 잘못된 디자인 패턴을 사용했을 수 있습니다 ... 추상 클래스를 확장 할 때마다 12 줄의 제네릭을 정의해야한다면 무엇인가 잘못되었습니다 !!자바 범용을 사용하여 조합 폭발

현재 특정 유형의 게임을위한 프레임 워크를 작성 중입니다. 내 프레임 워크에는 사용자가 확장해야하는 많은 추상 클래스가 포함되어 있습니다. 이 클래스들 중 상당수는 서로를 알고 있으며 사용자는 자신이 정의한 새로운 메소드와 멤버 변수를 구현하고 사용할 수 있어야합니다. 그래서 제네릭을 사용하고 지금까지 작동합니다.

그러나 여기에 문제가 있습니다 : 5 개 클래스가 서로 알고있는 경우 5x5 = 25 개를 정의해야합니다. 이러한 클래스 중 하나만이 두 개의 인터페이스/추상 클래스를 알고있는 경우 해당 클래스 중 하나의 추상 버전을 작성하여 7x7 = 49 대체를 정의해야합니다.

예 :

public abstract class AbsGameClient<ConncetionTypeClass extends Connection, 
           FactionBaseClass extends AbsBaseFaction, 
           PlayerSlotChangedListenerClass extends IAbsPlayerSlotChangedListener<FactionBaseClass>, 
           GameClientClass extends AbsGameClient<ConncetionTypeClass,FactionBaseClass,PlayerSlotChangedListenerClass,GameClientClass,PlayerSlotClass,GameClientListenerClass>, 
           PlayerSlotClass extends AbsPlayerSlot<FactionBaseClass, PlayerSlotChangedListenerClass, GameClientClass>, 
           GameClientListenerClass extends IAbsGameClientListener> 

           implements DefaultTBSclientMessageFlags, DefaultTBSserverMessageFlags {... 

그것은 작동하지만이 비슷한을 보관하기 위해 다른 디자인 패턴이 ... 코드 냄새처럼 보인다?

+0

형식 매개 변수에 긴 이름을 사용하지 마십시오. T, S, ... 및 심지어 Z까지 사용할 수 있습니다. AbsGameClient (T extends Connection, ...>)의 ** T **는 ** ConnectionTypeClass **를 의미하는 것만 큼 명확합니다. 그렇지 않으면 지저분 해 보입니다 – MockerTim

답변

5

달성하려는 목표를 정확히 모른 채 더 나은 방법을 제안하기는 어렵지만 예는 의심스러워 보입니다. 이러한 매개 변수마다 유형 변수가 정말로 필요한가요?

명백한 질문은 다형성을 활용할 수 없다는 것입니다. AbsGameClient은 실제로 이러한 매개 변수 각각의 특정 유형을 알아야합니까? 아니면 특정 유형의 연결을 모른 채 Connection 개체가 있다는 것을 알고 있으면 충분합니까?

+0

고마워, 두 번째 단락은 나에게 힌트를 주었다. 나는 모든 일반 확장을 대체해야한다고 생각했다 ... 아주 간단한 클래스로 몇 가지 테스트를했고, 많은 경우에 불필요한 것처럼 보인다 :-) – ToBe