010-004-008
オーバーロードで面積計算メソッドを実装
上級
問題説明
メソッドオーバーロード: 同じ名前、異なるシグネチャ
メソッドオーバーロードは、同じ名前で異なる引数リストを持つ複数のメソッドを定義できます。コンパイラは提供された引数に基づいて呼び出すメソッドを決定します。これにより、関連する操作が直感的な名前を共有するクリーンなAPIが作成されます。
オーバーロードの概念を理解することで、より柔軟なプログラム設計ができるようになります。一緒に学んでいきましょう。
学習目標
- 異なる引数シグネチャを持つ面積計算メソッドの設計を評価し、APIの直感性と保守性を判断できる
- オーバーロードされたメソッド間の適切な責任分離を分析し、単一責任原則に基づいて実装の妥当性を検証できる
- コンパイラのメソッド解決プロセスを診断し、引数の型と数に基づく呼び出し優先順位を推論できる
学習ポイント
- オーバーロード: 同じ名前、異なる引数
- シグネチャ: メソッド名 + 引数の型/数
- 解決: コンパイラがコンパイル時にメソッドを選択
- 戻り値の型: メソッドシグネチャに含まれない
オーバーロードのルール
| バリエーション | 例 | 有効? |
|---|---|---|
| 数が異なる | area(int) vs area(int,int) | 可 |
| 型が異なる | area(int) vs area(double) | 可 |
| 順序が異なる | f(int,String) vs f(String,int) | 可 |
| 戻り値のみ | int f() vs double f() | 不可 |
よくある間違い
エラーが出ても心配ありません。引数の型と数を見直してみましょう。
間違い1: 戻り値の型によるオーバーロード
コンパイルエラー:
public int getArea(int side) { return side * side; }
public double getArea(int side) { return side * side; } // エラー!
// 同じ引数、異なる戻り値 - 有効なオーバーロードではない間違い2: 曖昧な呼び出し
紛らわしい呼び出し:
void print(int x) { ... }
void print(long x) { ... }
print(5); // どっち?intはlongに昇格できる解決: コンパイラは最も具体的な一致を選択(int)。
実務での応用
- コンストラクタ: オブジェクト作成の複数の方法
- println(): int、String、Objectなどに対応
- 数学関数: max(int,int)、max(double,double)
- ファクトリメソッド: create(id)、create(name)、create(config)
設計のガイドライン
- オーバーロードメソッドの動作は一貫性を保つ
- 曖昧な引数の組み合わせを避ける
- エッジケースでどのバージョンが呼ばれるかドキュメント化
- 本当に可変の引数には可変長引数を検討
前提知識の詳細説明
この問題を解くために必要な知識を確認しましょう。
基本概念
この問題で扱うプログラミングの基本概念を理解することが、正しい解答への第一歩です。コードの各要素がどのように連携して動作するかを把握しましょう。
実装アプローチ
問題を解くための考え方を段階的に整理します:
- 問題文を読み、入力と出力の関係を理解する
- 必要な変数やデータ構造を特定する
- 処理の流れを組み立てる
- テストケースで動作を確認する
