インターフェイスと抽象化されたクラスは非常に似ているように見えますが、両者には重要な違いがあります。
抽象化は、優れた「 is-a」関係に基づいています。つまり、車はホンダであり、ホンダは車であると言えます。クラスで抽象化を使用すると、抽象メソッドも使用できるようになります。これには、抽象メソッドを取得してオーバーライドするために、そこから拡張されたサブクラスが必要になります。以下の例を使用して、抽象的な howToStart(); を作成できます。各クラスがそれを実装する必要があるメソッド。
抽象化により、コード間の類似性を提供できるため、基本クラスを維持できます。作成できる Car クラスのアイデアの例を使用すると、次のようになります。
public abstract class Car{
private String make;
private String model
protected Car() { } // Default constructor
protect Car(String make, String model){
//Assign values to
}
public abstract void howToStart();
}
次に、Honda クラスを使用すると、次のようになります。
public class Honda extends implements Engine {
public Honda() { } // Default constructor
public Honda(String make, String model){
//Assign values
}
@Override
public static void howToStart(){
// Code on how to start
}
}
インターフェイスは「has-a」関係に基づいています。これは、車にはエンジンがあると言えますが、エンジンは車ではありません。上記の例では、ホンダはimplements Engine
.
エンジン インターフェースの場合、以下を作成できます。
public interface Engine {
public void startup();
}
インターフェイスは、多対 1 のインスタンスを提供します。したがって、Engine インターフェースをあらゆるタイプの車に適用できます。他のオブジェクトに拡張することもできます。ボート クラスを作成し、ボート タイプのサブクラスを作成する場合と同様に、Engine を拡張し、ボートのサブクラスにstartup();
メソッドを要求させることができます。インターフェイスは、いくつかの類似点を持つさまざまなクラスへのフレームワークを作成するのに適しています。次のように、1 つのクラスに複数のインスタンスを実装することもできます。
public class Honda extends implements Engine, Transmission, List<Parts>
うまくいけば、これが役に立ちます。