最も簡単な方法は、Javaの組み込みのinstanceof演算子を使用することです。例えば:
public boolean isAAA(Thing myThing)
{
return myThing instanceof AAA;
}
ただし、多くの人は、instanceofの使用はクラス設計の不備の兆候であり、さまざまなサブクラスでさまざまな動作を実現する適切な方法はポリモーフィズムを使用することであると言うでしょう。ここでの問題は、Javaでは、派生型に基づいてクラスが異なることを行うのは非常に簡単ですが、ハンドルを持つ派生型に応じて、他のオブジェクトがThingを異なる方法で処理するようにするのは少し難しいことです。の上。これはダブルディスパッチの問題です。
Thingオブジェクトを処理するときに、次のように、Thingがどのサブクラスであるかに応じて、Thingで異なることを行う他のメソッドに問題をディスパッチできると理想的です。
public void handleThing(Thing myThing)
{
reactToThing(myThing);
}
public void reactToThing(AAA myThing)
{
// Do stuff specific for AAA
}
public void reactToThing(BBB myThing)
{
// Do stuff specific for BBB
}
public void reactToThing(Thing myThing)
{
// Do stuff for generic Thing
}
ただし、単一のディスパッチのみをサポートするJavaでは、handleThing()のmyThingの実際のタイプに関係なく、reactToThing(Thing)が常に呼び出され、独自の動作が得られることはありません。
この問題を回避するために必要なことは、VisitorPatternを使用することです。これには、Thingクラスとそのすべての子に追加のコードを配置して、reactToThing()メソッドに追加のコンテキストを与えることが含まれます。したがって、上記のメソッドがすべて、Visitorというクラスにあるとしましょう。最初に問題をThingオブジェクト自体に渡すことで、上記を書き直して機能させることができます。次に、ポリモーフィズムにより、オブジェクトが訪問者に返す適切なコンテキスト(Thing、AAA、またはBBB)が得られます。
したがって、上記の例を次のように書き直すことができます。
public class Visitor
{
// ...
public void handleThing(Thing myThing)
{
myThing.accept(this);
}
public void reactToThing(AAA myThing)
{
// Do stuff specific for AAA
}
public void reactToThing(BBB myThing)
{
// Do stuff specific for BBB
}
public void reactToThing(Thing myThing)
{
// Do stuff for generic Thing
}
}
public class Thing
{
// ...
public void accept(Visitor visitor)
{
visitor.reactToThing(this);
}
}
public class AAA
{
// ...
public void accept(Visitor visitor)
{
visitor.reactToThing(this);
}
}
public class BBB
{
// ...
public void accept(Visitor visitor)
{
visitor.reactToThing(this);
}
}
では、なぜ両方のサブクラスで同じaccept()メソッドを書き直す必要があったのでしょうか。それ以外の場合、visitor.reactToThing(this)メソッドを呼び出すときに、オブジェクトは引き続きThingコンテキストにあるため、以前と同じ問題が発生します。3つの場所すべてで再実装することにより、派生クラスは親の実装をオーバーライドし、Visitorで正しいメソッドが呼び出されます。
作業している派生クラスだけを知りたい場合は、多くの作業のように見えますが、その見返りは拡張性と保守です。これで、if(somethingElseの何かのインスタンス)をあちこちに追加する必要はありません。具体的には、たとえば、Visitorを拡張するなど、将来的に何かを変更する必要があると判断した場合に、維持する必要のある重複コードが少なくなります。
それがあなたの質問に対処することを願っています。