2011-05-16 9 views
1

ジェネリックに問題があります。間違ったデザインパターンを使用しています...抽象クラスを拡張するたびに12行のジェネリックを定義する必要がありますか?Javaジェネリックスを使用した組み合わせの展開

現時点では、特定の種類のゲーム用のフレームワークを作成しています。私のフレームワークは、ユーザによって拡張されるべき多くの抽象クラスを含んでいます。これらのクラスの多くはお互いを知っているので、ユーザーは自分自身で新しいメソッドやメンバ変数を実装し使用することができるはずです。だから私はジェネリックスを使用し、これまでのところ動作します。

しかし、ここに問題があります: お互いを知っている5つのクラスがある場合、5x5 = 25個の置換を定義する必要があります。それらのクラスのうちの1つだけがさらに2つのインタフェース/抽象クラスを知っているなら、それらのクラスの抽象バージョンを書くことによって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

ありがとう、2番目の段落は私にヒントを与えました。私はすべての一般的な拡張子を置き換えなければならないと思った...私は非常に単純なクラスでいくつかのテストを行い、多くの場合に不要です!:-) – ToBe