ポリモーフィックな振る舞い
ポリモーフィズムを使って、異なる図形の出力、ソート、集計を行います。モバイルでも読みやすいよう、アルゴリズムは小さく保ちます。
「ポリモーフィックな振る舞い」は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フィードバックを取得できます。ローカル設定は不要です。