2

スーパー タイプ (Shape) と 2 つの子 (Square、Circle など) があるとします。

私はこのようなものを作ろうとしています:

Shape shape = someObject.getShape();

if (shape instanceof Square){
    shape = (Square) shape;
    // do this
} else if (shape instanceof Circle) {
    shape = (Circle) shape;
    // do that
}

また、インスタンスを取得することは正しいオブジェクト指向の原則ではないように思われるため、それを行う別の方法はありますか? 乾杯。

編集。私はそれらのメソッドを呼び出そうとしているのではなく、特定のサブタイプを必要とするいくつかのメソッドにそれらを渡したいのです。

edit2基本的に、私はタイプ Shape のコレクションを持っているので、両方のタイプのサブタイプを保持できます。しかし、ある時点での処理に関しては、これら 2 つのサブクラスのどちらであるかを知る必要があるため、サブタイプを引数として取るメソッドにそれを渡すことができます。スーパータイプを引数として簡単に使用できますが、サブタイプ固有のデータを扱うため、安全ではありません。

4

3 に答える 3

7

変数を適切に宣言する必要があります。次に例を示します。

if (shape instanceof Square){
    Square square = (Square) shape;
    // do this with square
} else if (shape instanceof Circle) {
    Circle circle = (Circle) shape;
    // do that with circle
}
于 2012-04-10T20:10:50.033 に答える
1

ここで何を達成しようとしているのかよくわかりませんが、もちろん、次の形式でケースを変えることができます

shape.getClass().isAssignableFrom(Square.class) ? processSquare((Square)shape) : processCircle((Circle)shape)

最初に実際のクラスを確認すれば、そのキャストに問題はありません。

編集shape クラスの型は変わりません:

Shape[] shapes = new Shape[]{new Circle()}

シェイプ コレクションをループしているので、呼び出すとタイプshapes[0].getClass()が取得されますCircle.class。したがって、シェイプ コレクションを反復処理し、どのタイプ固有のコレクションを呼び出すかを決定する必要がある時点で、shape.getClass().isAssignableFrom(Circle.class)たとえばケースを切り替えるために呼び出すことができます。次に、型をキャストして、必要なメソッドを呼び出すことができます。形状オブジェクトを異なるコレクションに保持する必要はありません

于 2012-04-11T00:16:27.320 に答える
1

Java で参照を宣言すると、その型を変更することはできません。あなたがするとき:

Shape shape = someObject.getShape();

あなたが言っているのは、「変数形状に形状への参照を保存する」ということです。その型を変更することはできないので、それは意味がありません

shape = (Square) shape;

割り当ての右側に何があるかに関係なく、形状(左側)が形状であると言っているからです。

覚えておいてください: 参照の型を宣言すると、それを変更することはできません。

于 2012-04-10T20:23:34.243 に答える