抽象クラスを使用する場合とJavaでインターフェイスを使用する場合
インターフェイスはコントラクトの動作を定義するために使用でき、2つのシステム間のコントラクトとして機能して相互作用することもできますが、抽象クラスは主にサブクラスのデフォルトの動作を定義するために使用されます。つまり、すべての子クラスが同じ機能を実行する必要があります。
抽象クラスを使用する場合
- 抽象クラスは、派生クラスに共通の基本クラスの実装を提供するため、継承の概念を使用している場合に適しています。
- 非公開メンバーを宣言する場合は、抽象クラスも適しています。インターフェイスでは、すべてのメソッドがパブリックである必要があります。
- 将来、新しいメソッドを追加したい場合は、抽象クラスの方が適しています。インターフェイスに新しいメソッドを追加する場合、そのインターフェイスをすでに実装しているすべてのクラスを変更して、新しいメソッドを実装する必要があるためです。
- コンポーネントの複数のバージョンを作成する場合は、抽象クラスを作成します。抽象クラスは、コンポーネントをバージョン管理するためのシンプルで簡単な方法を提供します。基本クラスを更新することにより、すべての継承クラスが変更に応じて自動的に更新されます。一方、インターフェースは、一度作成すると変更できません。新しいバージョンのインターフェースが必要な場合は、まったく新しいインターフェースを作成する必要があります。
- 抽象クラスには、上位互換性を向上させるという利点があります。クライアントがインターフェースを使用すると、それを変更することはできません。抽象クラスを使用している場合でも、既存のコードを壊すことなく動作を追加できます。
- コンポーネントのすべての実装に共通の実装された機能を提供する場合は、抽象クラスを使用します。抽象クラスを使用すると、クラスを部分的に実装できますが、インターフェースにはメンバーの実装が含まれていません。
例
abstract class Car { public void accelerate() { System.out.println("Do something to accelerate"); } public void applyBrakes() { System.out.println("Do something to apply brakes"); } public abstract void changeGears(); }
これで、インスタンス化するCarは、changeGears()メソッドを実装する必要があります。
class Alto extends Car { public void changeGears() { System.out.println("Implement changeGears() method for Alto Car"); } } class Santro extends Car { public void changeGears() { System.out.println("Implement changeGears() method for Santro Car"); } }
インターフェースを使用する場合
- 作成している機能がさまざまな異なるオブジェクトで役立つ場合は、インターフェースを使用してください。抽象クラスは主に密接に関連するオブジェクトに使用する必要がありますが、インターフェイスは関連のないクラスに共通の機能を提供するのに最適です。
- APIがしばらく変更されないと思われる場合は、インターフェースが適しています。
- インターフェースは、複数のインターフェースを実装できるため、多重継承に似たものが必要な場合にも適しています。
- 小さく簡潔な機能を設計する場合は、インターフェースを使用します。大規模な機能ユニットを設計する場合は、抽象クラスを使用してください。
例
public interface Actor { void perform(); } public interface Producer { void invest(); }
今日、俳優のほとんどは、自分の映画を制作するのに十分な金持ちです。抽象クラスではなくインターフェースを使用している場合は、ActorとProducerの両方を実装できます。また、両方を拡張する新しいActorProducerインターフェースを定義することもできます。
public interface ActorProducer extends Actor, Producer{ // some statements }
-
Javaのインターフェース
インターフェースはJavaの参照型です。クラスに似ています。これは、抽象的なメソッドのコレクションです。クラスはインターフェースを実装し、それによってインターフェースの抽象メソッドを継承します。 インターフェイスには、抽象メソッドに加えて、定数、デフォルトメソッド、静的メソッド、およびネストされた型も含まれる場合があります。メソッド本体は、デフォルトのメソッドと静的メソッドにのみ存在します。 インターフェイスの作成は、クラスの作成に似ています。ただし、クラスはオブジェクトの属性と動作を記述します。また、インターフェースには、クラスが実装する動作が含まれています。 インターフェイスを実装す
-
Javaの抽象クラス
宣言にabstractキーワードを含むクラスは、abstractクラスと呼ばれます。 抽象クラスには、抽象メソッド、つまり本体のないメソッドが含まれる場合と含まれない場合があります(public void get();) ただし、クラスに少なくとも1つの抽象メソッドがある場合、そのクラスは抽象として宣言する必要があります。 クラスが抽象として宣言されている場合、インスタンス化することはできません。 抽象クラスを使用するには、それを別のクラスから継承し、そのクラスに抽象メソッドの実装を提供する必要があります。 抽象クラスを継承する場合は、その中のすべての抽象メソッドに実装を提供する必要がありま