Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
学ぶ OOPの原則 抽象化 | オブジェクト指向プログラミング
Java OOP

bookOOPの原則 抽象化

メニューを表示するにはスワイプしてください

抽象化

これで、OOP の最後でありながら非常に重要な原則である 抽象化 にたどり着きました。「抽象化」という言葉はかなり抽象的に聞こえますが、簡単に言えば、この原則は「特定の実装ではなく、抽象に依存すべきである」と教えています。ただし、今は少し難しく感じるかもしれません。まずは定義から見ていきましょう。

例えば、Person, というクラスがあり、そこから多くの異なるクラスが派生しているとします。Person にはすべてのクラスに共通するさまざまなフィールドやメソッドがあります。しかし、BasketballPlayer, というクラスの場合、height の特性が非常に重要になりますが、Driver のようなクラスでは height関係なく重要ではありません。ここで抽象化が役立ちます。抽象から継承することで、height パラメータをオプションにでき、必要のない場所で使用する必要がなくなります。

少し難しく感じるかもしれませんので、例を見てみましょう。

Car.java

Car.java

copy
123456789
public 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つの抽象メソッドを含むクラスです。抽象メソッドがなくても抽象クラスを作成できますが、その場合は意味がありません。抽象クラスのインスタンス化はできません;
  2. 抽象メソッドは抽象クラス内にのみ存在できます。抽象クラスの外で抽象メソッドを作成することはできません;
  3. 抽象クラス内のメソッドは、抽象メソッドまたは実装を持つメソッドのいずれかです;
  4. 抽象クラスを継承したクラスは、すべての抽象メソッドをオーバーライドする必要があります
  5. 継承できるクラス(抽象・非抽象問わず)は1つまでです;
  6. 抽象クラスは、継承するクラスの共通のプロパティと振る舞いを表現するべきです。これについてはSOLID原則を学ぶ際にさらに詳しく説明します。

抽象クラスを継承し、サブクラスがどのように抽象メソッドをオーバーライドするべきかを理解するために、子クラスTruckの例を見てみましょう:

スクリーンショットのコードを、より読みやすく明確に書き直したものです。

Car.java

Car.java

Truck.java

Truck.java

Main.java

Main.java

copy
123456789
public 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. 抽象化はコードの保守性にどのように貢献しますか?

question mark

オブジェクト指向プログラミングにおける抽象化とは何ですか?

正しい答えを選んでください

question mark

抽象化について正しいものはどれですか?

すべての正しい答えを選択

question mark

Javaにおける抽象クラスの目的は何ですか?

正しい答えを選んでください

question mark

抽象化はコードの保守性にどのように貢献しますか?

正しい答えを選んでください

すべて明確でしたか?

どのように改善できますか?

フィードバックありがとうございます!

セクション 2.  7

AIに質問する

expand

AIに質問する

ChatGPT

何でも質問するか、提案された質問の1つを試してチャットを始めてください

セクション 2.  7
some-alt