ジェネリックに問題があります。間違ったデザインパターンを使用しています...抽象クラスを拡張するたびに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 {...
それは動作しますが、それはコードのにおいのように見える...似たものをアーカイブする他のデザインパターンはありますか?
正式型パラメータには、このような長い名前を使用しないでください。あなたはT、S、...とZでも使えます。AbsGameClient(T extends Connection、...>)の** T **は** ConnectionTypeClass **を意味しています。それ以外の場合は乱雑です。 – MockerTim