Statement
、IfStatement
など、他のいくつかのクラスが継承する基本クラスWhereStatement
があります。if
ステートメントでテストを実行して、インスタンスの派生元であるStatement
クラスの種類を判別する最良の方法は何ですか。
if (obj.getClass().isInstance(Statement.class)) {
doStuffWithStatements((Statement) obj));
}
この手法の( "instanceof"キーワードとは対照的な)優れた点は、テストクラスをオブジェクトとして渡すことができることです。しかし、そうです、それ以外は、「instanceof」と同じです。
注:type-instance-checkingがrightを実行するかどうかを編集することを意図的に避けています。ええ、ほとんどの場合、ポリモーフィズムを使用する方が良いでしょう。しかし、それはOPが尋ねたものではなく、私は彼の質問に答えるだけです。
_if(object instanceof WhereStatement) {
WhereStatement where = (WhereStatement) object;
doSomething(where);
}
_
このようなコードは通常、基本クラスにポリモーフィックメソッドがないことを意味します。つまり、doSomething()
は、サブクラスによってオーバーライドされるStatement
のメソッドであり、抽象的である必要があります。
あなたの質問への答えはinstanceofです。
ただし、コードにinstanceofが必要な場合は、デザインに問題があることを示しています。 instanceofが正当化される場合がありますが、それらはかなり例外です。通常、サブクラスが異なる動作をする必要がある場合は、if()の代わりにポリモーフィズムを使用する必要があります。
クラスのisAssignableFrom(Java.lang.Class)が答えです。 http://download.Oracle.com/javase/6/docs/api/Java/lang/Class.html#isAssignableFrom(Java.lang.Class )
これを試して:
if (Statement.class.isInstance(obj)) {
doStuffWithStatements((Statement) obj));
}
なぜなら、 Class.isInstance() メソッドは、オブジェクトインスタンスをパラメーターとしてとるからです。
これはnotがオブジェクト指向の方法で物事を行う方法であり、古いコードとデータの二分法への逆戻りです。これは必ずしも悪いことではありません(何をしているのかわかっている場合)が、Cなどの非オブジェクト指向言語に任せる必要があります。
適切な設計では、そのような動作は必要ありません。構成の代わりに:
if (obj.getClass().isInstance(Statement.class)) {
doStuffWithStatements((Statement) obj));
}
(彼のコードを「盗む」ことに対するベンジスミスへの謝罪)、あなたは本当にオブジェクト自体をそれ自身の活動に責任があるようにするべきです:
obj.doStuff();
次に、異なるobj
クラスごとに、doStuff
の独自の定義があります。それが正しい方法です。