015 ポリモーフィズム(ダウンキャスト) 010 解答例

// Shape クラスとそのサブクラス Circle クラス、Square クラス
class Shape {
    void draw() {
        System.out.println("Drawing a shape");
    }
}

class Circle extends Shape {
    void draw() {
        System.out.println("Drawing a circle");
    }

    void calculateArea() {
        System.out.println("Calculating the area of a circle");
    }
}

class Square extends Shape {
    void draw() {
        System.out.println("Drawing a square");
    }

    void calculateArea() {
        System.out.println("Calculating the area of a square");
    }
}

public class Main {
    public static void main(String[] args) {
        // Shape クラス型の配列を作成
        Shape[] shapes = new Shape[3];

        // 異なる形状のオブジェクトを配列に格納
        shapes[0] = new Circle();
        shapes[1] = new Square();
        shapes[2] = new Shape();

        // 配列からオブジェクトを取り出してダウンキャストして特有のメソッドを呼び出す
        for (Shape shape : shapes) {
            if (shape instanceof Circle) {
                Circle circle = (Circle) shape;
                circle.calculateArea();
            } else if (shape instanceof Square) {
                Square square = (Square) shape;
                square.calculateArea();
            }
        }
    }
}

この例では、Shape クラス型の配列を作成し、異なる形状のオブジェクトを格納しています。そして、配列から要素を取り出して、各要素を Circle クラスや Square クラスにダウンキャストして、それぞれの特有のメソッド(calculateArea メソッド)を呼び出しています。instanceof 演算子を使用して、ダウンキャストが成功するかどうかを確認しています。

配列でのダウンキャスト

配列でのダウンキャストにはいくつか重要なポイントがあります。以下に、その解説をします。

  1. 要素の実際の型の確認 (instanceof 演算子):
    • 配列から要素を取り出す前に、その要素が期待する型であるかを確認するために instanceof 演算子を使用します。
    • instanceof 演算子は、左辺のオブジェクトが右辺のクラスのインスタンスであれば true を返し、そうでなければ false を返します。
    • この確認を行うことで、ダウンキャストが成功するかどうかを安全に確認できます。
  2. 要素のダウンキャスト:
    • instanceof 演算子で確認した後、実際にダウンキャストを行います。
    • ダウンキャストを行う際には、キャスト演算子 (Type) を使用します。
    • ダウンキャスト後には、その要素の型に合わせたメソッドを安全に呼び出すことができます。

問題の解答例ではShape クラス型の配列に異なる形状のオブジェクトを格納し、配列から要素を取り出して instanceof 演算子で型を確認した後、ダウンキャストして特有のメソッドを呼び出しています。

「015 ポリモーフィズム」問題集リスト