30

、などという名前の、Statement他のいくつかのクラスが継承するベースクラスがあります...インスタンスがどの種類のクラスから派生したかを判断するためにステートメントでテストを実行する最良の方法は何ですか?IfStatementWhereStatementifStatement

4

6 に答える 6

78
if(object instanceof WhereStatement) {
   WhereStatement where = (WhereStatement) object;
   doSomething(where);
}

このようなコードは通常、基本クラスにポリモーフィック メソッドがないことを意味することに注意してください。つまり、サブクラスによってオーバーライドされる、おそらく抽象化されdoSomething()た のメソッドである必要があります。Statement

于 2009-05-29T23:25:31.293 に答える
64
if (obj.getClass().isInstance(Statement.class)) {
   doStuffWithStatements((Statement) obj));
}

("instanceof" キーワードとは対照的に) この手法の優れた点は、テストクラスをオブジェクトとして渡すことができることです。でも、それ以外は「instanceof」と同じです。

注: 型インスタンス チェックが正しいかどうかについては、意図的に編集を避けました。ええ、ほとんどの場合、ポリモーフィズムを使用する方が適切です。しかし、それはOPが尋ねたものではなく、私は彼の質問に答えているだけです.

于 2009-05-29T23:25:22.540 に答える
6

あなたの質問に対する答えは instanceof です。

ただし、コードに instanceof が必要な場合は、設計に問題があることを示していることに注意してください。instanceof が正当化される場合もありますが、それらはむしろ例外です。通常、サブクラスが異なる動作をする必要がある場合は、if() の代わりにポリモーフィズムを使用する必要があります。

于 2009-05-29T23:30:28.193 に答える
2

isAssignableFrom(java.lang.Class)クラスからあなたの答えです。

于 2011-10-20T06:31:21.800 に答える
1

これを試して:

if (Statement.class.isInstance(obj)) {
    doStuffWithStatements((Statement) obj));
}

Class.isInstance()メソッドはオブジェクト インスタンスをパラメーターとして受け取るためです。

于 2016-10-07T21:10:12.757 に答える
0

これはオブジェクト指向の方法ではなく、古いコード/データの二分法への回帰ですこれは必ずしも悪いことではありませんが (自分が何をしているのかわかっている場合)、C などの非オブジェクト指向言語に任せるべきです。

適切な設計があれば、そのような動作は必要ありません。コンストラクトの代わりに:

if (obj.getClass().isInstance(Statement.class)) {
    doStuffWithStatements((Statement) obj));
}

(ベンジスミスのコードを「盗んだ」ことをお詫びします)、実際には、オブジェクト自体にそれ自身のアクティビティの責任を負わせるべきです:

obj.doStuff();

次に、異なるobjクラスごとに独自の の定義がありdoStuffます。それが正しいやり方です。

于 2009-05-29T23:43:17.077 に答える