インターフェイスは動作コントラクトを定義するために使用でき、2 つのシステム間の対話のためのコントラクトとしても使用できます。一方、抽象クラスは主にサブクラスのデフォルト動作を定義するために使用されます。つまり、すべてのサブクラスです。同じ機能を実行する必要があります。
抽象クラスを使用する場合
- 継承の概念を使用する場合、抽象クラスは派生クラスに共通の基本クラス実装を提供するため、適切な選択肢となります。
- 非パブリック メンバーを宣言したい場合は、抽象クラスも良い選択です。インターフェイスでは、すべてのメソッドがパブリックである必要があります。
- 将来新しいメソッドを追加したい場合は、抽象クラスを使用することをお勧めします。新しいメソッドをインターフェイスに追加する場合、そのインターフェイスをすでに実装しているすべてのクラスを、新しいメソッドを実装するように変更する必要があるためです。
- コンポーネントの複数のバージョンを作成したい場合は、抽象クラスを作成できます。抽象クラスは、コンポーネントをバージョン管理するための使いやすい方法を提供します。基本クラスを更新すると、継承されたすべてのクラスが自動的に更新されます。インターフェイスが作成されると、変更することはできません。新しいバージョンのインターフェイスが必要な場合は、完全に新しいインターフェイスを作成する必要があります。
- 抽象クラスには、より優れた前方互換性があります。クライアントがインターフェースを使用すると、それを変更することはできませんが、クライアントが抽象クラスを使用する場合でも、既存のコードを壊さずに動作を追加できます。
- コンポーネントのすべての実装に共通の実装機能を提供したい場合は、抽象クラスを使用できます。抽象クラスを使用すると、クラスを部分的に実装できますが、インターフェイスにはメンバーの実装が含まれません。
Example
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();
}
ログイン後にコピー
さて、インスタンス化したい車は、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();
}
ログイン後にコピー
現在、ほとんどの俳優は自分の映画を製作できるほど裕福です。抽象クラスの代わりにインターフェイスを使用すると、アクターとプロデューサーの両方を実装できます。さらに、両方を継承する新しい ActorProducer インターフェイスを定義することもできます。
えええええ
以上がJava でいつ抽象クラスを使用し、いつインターフェイスを使用するか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。