0Pricing
Java Academy · レッスン

ポリモーフィックな振る舞い

ポリモーフィズムを使って、異なる図形の出力、ソート、集計を行います。モバイルでも読みやすいよう、アルゴリズムは小さく保ちます。

「ポリモーフィックな振る舞い」はCoddyKit上の無料Java Academyレッスンです。 これはレッスン3/3です。 下記で完全なレッスンを無料で読むことができます。その後、ブラウザ内の組み込みコードエディタと24時間対応のAIチューターでハンズオン演習できます。 これはJava Academy学習パスの一部であり、ウェブとCoddyKitアプリ全体で進捗が同期されます。 Java Academyコースには全3レッスンが含まれています。

概要

ポリモーフィックな動作を使うと、すべての図形を同じように扱いながら、それぞれ独自の計算を実行できます。ここでは、(1)混在したリストを統一して出力し、(2)areaで並べ替え、(3)1つのループで合計を計算します。

基底APIのチェックリスト

基底APIには、どこでも使う操作をまとめます:

  • area()とperimeter() — 各図形で実装する必要があります。
  • 整った出力のためのlabel()やinfo()のような小さな任意のヘルパー。
  • フィールドは具象図形の内部に保持します。

コード: 統一した出力

統一した出力: ループではShapeのAPIだけを使います。各オブジェクトが計算のために独自の実装を実行します。

public class Main {
  static abstract class Shape {
    abstract double area();
    abstract double perimeter();
    String label() { return getClass().getSimpleName(); }
    String info() { return String.format("area=%.2f, per=%.2f", area(), perimeter()); }
  }
  static class Circle extends Shape {
    double r; Circle(double r) { this.r = (r < 0) ? 0 : r; }
    double area() { return Math.PI * r * r; }
    double perimeter() { return 2 * Math.PI * r; }
  }
  static class Rectangle extends Shape {
    double w, h; Rectangle(double w, double h) { this.w = Math.max(0, w); this.h = Math.max(0, h); }
    double area() { return w * h; }
    double perimeter() { return 2 * (w + h); }
  }
  public static void main(String[] args) {
    Shape[] list = { new Circle(2.0), new Rectangle(3.0, 4.0), new Circle(1.0) };
    for (int i = 0; i < list.length; i = i + 1) {
      Shape s = list[i];
      System.out.println(s.label() + " -> " + s.info());
    }
  }
}

面積での並べ替え(考え方)

並べ替えの考え方:

  • 比較: 2つの図形のarea()の値を比較します。
  • 少量のデータなら、単純なバブルソート/選択ソートで十分です。
  • Shapeのメソッドだけを使い、型チェックはしません。

コード: 面積で並べ替え

単純な並べ替えでは、area()の呼び出しだけが必要です。型チェックはありません。これがポリモーフィズムの力です。

public class Main {
  static abstract class Shape { abstract double area(); abstract double perimeter(); String label(){ return getClass().getSimpleName(); } }
  static class Circle extends Shape { double r; Circle(double r){ this.r = Math.max(0, r);} double area(){return Math.PI*r*r;} double perimeter(){return 2*Math.PI*r;} }
  static class Rectangle extends Shape { double w,h; Rectangle(double w,double h){ this.w=Math.max(0,w); this.h=Math.max(0,h);} double area(){return w*h;} double perimeter(){return 2*(w+h);} }

  // Very small bubble sort for beginners (ascending by area)
  static void sortByArea(Shape[] arr){
    for(int pass=0; pass<arr.length-1; pass=pass+1){
      for(int i=0; i<arr.length-1; i=i+1){
        if(arr[i].area() > arr[i+1].area()){
          Shape tmp = arr[i]; arr[i] = arr[i+1]; arr[i+1] = tmp;
        }
      }
    }
  }

  public static void main(String[] args) {
    Shape[] a = { new Rectangle(3,4), new Circle(2), new Circle(1) };
    sortByArea(a);
    for(int i=0;i<a.length;i=i+1){
      System.out.println(a[i].label() + " area=" + String.format("%.2f", a[i].area()));
    }
  }
}

コード: 面積の合計

合計の計算では、1つのループでarea()の呼び出し結果を加算します。各要素が独自の計算を行うため、コードはシンプルなままです。

public class Main {
  static abstract class Shape { abstract double area(); abstract double perimeter(); }
  static class Circle extends Shape { double r; Circle(double r){ this.r=Math.max(0,r);} double area(){return Math.PI*r*r;} double perimeter(){return 2*Math.PI*r;} }
  static class Rectangle extends Shape { double w,h; Rectangle(double w,double h){ this.w=Math.max(0,w); this.h=Math.max(0,h);} double area(){return w*h;} double perimeter(){return 2*(w+h);} }

  static double totalArea(Shape[] arr){
    double sum = 0.0;
    for(int i=0;i<arr.length;i=i+1){
      sum = sum + arr[i].area(); // polymorphic call
    }
    return sum;
  }

  public static void main(String[] args) {
    Shape[] list = { new Circle(1), new Rectangle(2,3), new Circle(0.5) };
    System.out.println("Total area = " + String.format("%.2f", totalArea(list)));
  }
}

ポリモーフィズムのスタイル確認

簡単な確認: ここでポリモーフィズムを最も適切に活用しているコードの書き方はどれですか?

復習

復習: 同じAPIでコードを書き、各図形がそれぞれの結果を生成しました。出力、並べ替え、合計などの処理を、1つのコードで実行できました。

よくある質問

「ポリモーフィックな振る舞い」レッスンは無料ですか?

はい。「ポリモーフィックな振る舞い」の完全なテキストはこのウェブで無料で読めます。インタラクティブに演習し(組み込みコードエディタと24時間対応のAIチューター)、Java Academyコースの残りをアンロックするには、CoddyKit PROにアップグレードしてください。 Java Academyコースには全3レッスンが含まれています。

「ポリモーフィックな振る舞い」で何を学びますか?

ポリモーフィズムを使って、異なる図形の出力、ソート、集計を行います。モバイルでも読みやすいよう、アルゴリズムは小さく保ちます。 ブラウザで直接実行するハンズオンコードでJava Academyを演習し、24時間対応のAIチューターがレッスンを進める中での質問に答えます。

Java Academyを始めるのに経験は必要ですか?

事前経験は必要ありません。CoddyKitのJava Academyは初級者から上級者向けに構成されているため、ここから始めるか最初から始めて、自分のペースで進むことができます。 これはレッスン3/3です。

「ポリモーフィックな振る舞い」レッスンにはどのくらい時間がかかりますか?

ほとんどのCoddyKitレッスンは約5~10分かかります。各レッスンはコンパクトでインタラクティブなので、着実に進歩し、ウェブとアプリ全体で正確に前回の場所から再開できます。

このJava Academyレッスンでコードを書いて実行できますか?

はい。すべてのJava Academyレッスンに組み込みコードエディタが含まれているため、ブラウザでリアルコードを書いて実行し、即座のAIフィードバックを取得できます。ローカル設定は不要です。

このコースのすべてのレッスン

  1. 設計
  2. 実装
  3. ポリモーフィックな振る舞い
← Java Academyに戻る