OOPの原則 抽象化
メニューを表示するにはスワイプしてください
抽象化
これで、OOP の最後でありながら非常に重要な原則である 抽象化 にたどり着きました。「抽象化」という言葉はかなり抽象的に聞こえますが、簡単に言えば、この原則は「特定の実装ではなく、抽象に依存すべきである」と教えています。ただし、今は少し難しく感じるかもしれません。まずは定義から見ていきましょう。
例えば、Person, というクラスがあり、そこから多くの異なるクラスが派生しているとします。Person にはすべてのクラスに共通するさまざまなフィールドやメソッドがあります。しかし、BasketballPlayer, というクラスの場合、height の特性が非常に重要になりますが、Driver のようなクラスでは height は関係なく重要ではありません。ここで抽象化が役立ちます。抽象から継承することで、height パラメータをオプションにでき、必要のない場所で使用する必要がなくなります。
少し難しく感じるかもしれませんので、例を見てみましょう。
Car.java
123456789public abstract class Car { String model; int year; int maxSpeed; String color; public abstract void move(); public abstract void stop(); }
Car クラスは特定のものを表していません。単なる Car というものは存在せず、セダン、トラック、トラクター などがあります。そのため、Car という抽象概念に依存します。さらに簡単に言えば、
Car は、特定の車クラスを作成するためのテンプレートです。
構文に注目してください:
public abstract class className{ }.
これは抽象クラスを宣言するための構文です。 また、抽象メソッドを宣言する構文にも注意してください:
public abstract returnValue methodName();
抽象メソッドには本体がありません。これがその主な特徴です。抽象クラスのサブクラスは、この抽象メソッドをオーバーライドし、それぞれ独自の実装を定義します(ポリモーフィズムを利用)。
抽象クラスとは何か、さらに詳しく見ていきましょう:
抽象クラスのオブジェクトは作成できないことに注意してください。これを行うとエラーになります:
抽象クラスは単なる「オブジェクト」の扱いから私たちを解放し、基本的な状態と振る舞いを提供します。車の例を挙げると、各車にはモデル、製造年、最高速度、色が必要です。また、移動や停止もできる必要があります。これがすべてであり、ここからこの抽象的な設計図をもとに具体的なクラスを設計します。
抽象クラス作成のルール
- 抽象クラスは少なくとも1つの抽象メソッドを含むクラスです。抽象メソッドがなくても抽象クラスを作成できますが、その場合は意味がありません。抽象クラスのインスタンス化はできません;
- 抽象メソッドは抽象クラス内にのみ存在できます。抽象クラスの外で抽象メソッドを作成することはできません;
- 抽象クラス内のメソッドは、抽象メソッドまたは実装を持つメソッドのいずれかです;
- 抽象クラスを継承したクラスは、すべての抽象メソッドをオーバーライドする必要があります;
- 継承できるクラス(抽象・非抽象問わず)は1つまでです;
- 抽象クラスは、継承するクラスの共通のプロパティと振る舞いを表現するべきです。これについてはSOLID原則を学ぶ際にさらに詳しく説明します。
抽象クラスを継承し、サブクラスがどのように抽象メソッドをオーバーライドするべきかを理解するために、子クラスTruckの例を見てみましょう:
スクリーンショットのコードを、より読みやすく明確に書き直したものです。
Car.java
Truck.java
Main.java
123456789public abstract class Car { String model; int year; int maxSpeed; String color; public abstract void move(); public abstract void stop(); }
上記の内容について、詳細に見ていきましょう。
-
最初のスライド: サブクラス
Truckを作成し、抽象クラスCarから継承しています。IDEが必要なメソッドの実装を促していることが分かります。 -
2番目のスライド: 必要なメソッドをオーバーライドしています。例えば、
Truckが動き始めて停止したことを記述します。 -
3番目のスライド:
mainメソッドでオブジェクトを作成します。使用されている構文に注目してください:Car name = new Truck();。抽象化を通じてオブジェクトの作成を開始し、具体的な実装で終わります。これはコンポジションと呼ばれます。その後、必要に応じてフィールドに値を代入し、オーバーライドしたメソッドを呼び出します。
Voilà! すべて理解できたなら、抽象クラスの使い方を習得したことになります。
まとめ
抽象化は、OOP の原則の中でも最も理解が難しいものの一つです。現時点で全てを理解できていなくても心配はいりません。抽象化は、多くの開発者が最初は難しいと感じる概念です。時間が経つにつれて、抽象化や抽象クラスを効果的に扱う方法がよりよく分かるようになります。抽象化は、プログラムを拡張可能かつ高い柔軟性を持たせるための重要な原則です。
1. オブジェクト指向プログラミングにおける抽象化とは何ですか?
2. 抽象化について正しいものはどれですか?
3. Javaにおける抽象クラスの目的は何ですか?
4. 抽象化はコードの保守性にどのように貢献しますか?
フィードバックありがとうございます!
AIに質問する
AIに質問する
何でも質問するか、提案された質問の1つを試してチャットを始めてください