さて、私は抽象クラス A のプロジェクトに取り組んでいます。クラス a1、a2、および a3 はすべてクラス A から継承され、各サブクラスに固有のメソッドがいくつか追加されているとします。現在、これらのオブジェクトは、ユーザーの操作の結果として他のオブジェクトとペアにすることができますが、特定のタイプのオブジェクトのみをペアにすることができます。つまり、オブジェクト B は a1 のみを使用でき、オブジェクト C は a2 のみを使用でき、ユーザーがそうしないと、ペアリングできないと伝えられます。私は確かに instanceof を避けたいと思っています。親クラスに getType() などのメソッドを追加して、各サブクラスに固有の文字列を返すことを考えましたが、陳腐に感じます。クラス名をつかむことは、ほとんど同じように感じます。私'
2 に答える
本当に instanceof を使用しないことに設定されていて、何らかの理由でインスタンス クラスを超えてペアリングのパラメーターを定義できない場合は、次の 2 つのいずれかを実行する set new メソッドを抽象クラスに追加します。
a) メソッド worksWithTypeB、worksWithTypeC などを、必要に応じてサブクラスで定義します。ただし、これは型チェックによく似ています。
b) タイプ B および C によって使用されるメソッドを抽象クラスに転送します。通常、B と C で使用できるクラスでそれらを定義します (したがって、タイプ B は a1.methodB を使用し、タイプ C は a2.methodC を使用するとします)。それ以外の場合は存在します (したがって、a1.methodC は a2.methodB と同様に例外をスローします)。
ilcavero が言ったように、この場合、型チェックに問題はありません。
この場合、ジェネリックを使用して解決策を考えていました。
これを行うには、次のように 2 つの値を一般的に格納するクラスを定義する必要があります。
class Pair < k, v extends A>
これで、ハッシュマップにすべてのタイプのペアを追加することになります。そのタイプのペアが必要な場合は、その名前でペアを取得します。
短所:
必要なすべてのペアをコンテナに追加する必要があります
ペアに名前を関連付ける必要があります
大規模な場合、これは悪い解決策になることに注意してください。