90

いつインターフェイスを使用する必要があるのか​​ 疑問に思っていました。

次のことを考えてみましょう。

public abstract class Vehicle {
   abstract float getSpeed();
}

と :

public interface IVehicle {
  float getSpeed();
}

どちらも簡単に実装でき、機能は同じです...しかし、車両クラスにいくつかの変数を追加することもできます。これは、おそらく車両で使用する必要があります(maxSpeed、carType ...)

インターフェイスを使用する理由は何ですか?

ありがとう!

編集:別のスレッドでそれについての素晴らしいリンクを見つけました: http://www.thecoldsun.com/en/content/01-2009/abstract-classes-and-interfaces

4

18 に答える 18

18

Oracle チュートリアルから:

インターフェイスとは異なり、抽象クラスには staticおよびfinalではないフィールドを含めることができ、実装されたメソッドを含めることができます。このような抽象クラスは、部分的な実装を提供し、実装を完了するためにサブクラスに任せることを除いて、インターフェイスに似ています。抽象クラスに抽象メソッド宣言のみが含まれている場合は、代わりにインターフェイスとして宣言する必要があります。

複数のインターフェイスは、相互に何らかの形で関連しているかどうかに関係なく、クラス階層内の任意の場所でクラスによって実装できます。たとえば、Comparableまたはを考えてみてください。Cloneable

比較すると、抽象クラスは、実装の一部を共有するためにサブクラス化されるのが最も一般的です。単一の抽象クラスは、多くの共通点 (抽象クラスの実装された部分) を持つ類似のクラスによってサブクラス化されますが、いくつかの違い (抽象メソッド) もあります。

于 2013-05-27T22:33:47.147 に答える
11

多くの場合、両方のクラス タイプで実装できます。

インターフェイスは、少なくとも基本的な機能が必要なクラスを定義する場合に役立ちます。USBなどの実際のインターフェースのように。

interface USB {
    public function sendPower(); //charge iphone for example
    public function sendData(); //itunes
    public function recieveData();
}

オブジェクトを実装する方法がいくつかある場合は、抽象クラスを使用します。

abstract class MobilePhone {
    public function isIphone();

    public function charge() {
        //get some power, all phones need that
    }
}

class iPhone extends MobilePhone {
    public function isIphone() { return true; }
}
于 2013-05-27T22:43:32.023 に答える
7

抽象的な実装よりもインターフェースを使用することを検討する場合が多くあります

  • 利用可能な抽象実装が希望どおりに機能せず、独自の抽象実装を作成したい場合
  • (他のクラスから拡張された) 既存のクラスがあり、インターフェイスの機能を実装したい場合

一般的に言えば、インターフェイスは多重継承の欠如を克服するために導入されました。

于 2013-05-27T22:36:03.477 に答える
5

Java™ チュートリアルから- インターフェースと比較した抽象クラス

抽象クラスとインターフェースのどちらを使用する必要がありますか?

  • これらのステートメントのいずれかが状況に当てはまる場合は、抽象クラスの使用を検討してください。
    • 密接に関連するいくつかのクラス間でコードを共有したい。
    • 抽象クラスを拡張するクラスには、多くの一般的なメソッドまたはフィールドがあるか、public 以外のアクセス修飾子 (protected や private など) が必要であることが予想されます。
    • 非静的または非最終フィールドを宣言したい。これにより、属するオブジェクトの状態にアクセスして変更できるメソッドを定義できます。
  • これらのステートメントのいずれかが状況に当てはまる場合は、インターフェイスの使用を検討してください。
    • 無関係なクラスがインターフェイスを実装することを期待しています。たとえば、インターフェイスComparableCloneableは、多くの無関係なクラスによって実装されます。
    • 特定のデータ型の動作を指定したいが、その動作を誰が実装するかは気にしない。
    • 型の多重継承を利用したい。

JDK の抽象クラスの例はAbstractMap、コレクション フレームワークの一部である です。そのサブクラス ( HashMap、、TreeMapおよびを含む) は、定義ConcurrentHashMapする多くのメソッド ( getputisEmpty、を含む) を共有します。containsKeycontainsValueAbstractMap

于 2016-06-03T10:39:10.153 に答える
5

Java 8 のリリース以降、インターフェイスでのデフォルト メソッドのサポートにより、インターフェイスクラスと抽象クラスの間のギャップは縮小されましたが、それでも大きな違いがあります。

  1. インターフェイスの変数はpublic static finalです。ただし、抽象クラスは、プライベート、保護などの他のタイプの変数を持つことができます

  2. インターフェイスのメソッドはパブリックまたはパブリック静的ですが、抽象クラスのメソッドは プライベートおよび保護することもできます

  3. 相互に関連するオブジェクト間の関係を確立するには、抽象クラスを使用します。インターフェイスを使用して、無関係なクラス間の関係を確立します。

Java 8 のインターフェイスの特別なプロパティについては、この記事を参照してください。@override を使用する場合、インターフェイスのデフォルト メソッドの静的修飾子により、派生エラーでコンパイル時エラーが発生します。

この記事では、Java 8 でデフォルト メソッドが導入された理由について説明します 。Java 8 でコレクション API を拡張してラムダ式をサポートするためです。

より良い方法で違いを理解するために、オラクルのドキュメントも見てください。

この関連する SE の質問とコード例を見て、物事をよりよく理解してください。

Interface と Abstract クラスの違いをどのように説明すればよいでしょうか?

于 2015-11-27T12:09:42.843 に答える
4

サブクラスのグループのテンプレートを定義する必要があり、サブクラスを呼び出す実装コードが少なくともいくつかある場合は抽象クラスを使用します。

クラスが継承ツリーのどこにあるかに関係なく、他のクラスが果たすことができる役割を定義したい場合は、インターフェイスを使用します。

抽象クラスを拡張します

あなたはインターフェースを実装します:)

インターフェイスでは、すべてのフィールドが自動的public static finalに、すべてのメソッドが自動的に実行されますがpublic抽象クラスでは、ここで少し柔軟性が得られます。

于 2016-07-20T20:30:15.030 に答える
2

これは、 Bruce Eckel による優れた本「 Thinking in Java 」からの直接の抜粋です。

[..]インターフェイスまたは抽象クラスを使用する必要がありますか?

インターフェイスは、抽象クラスの利点とインターフェイスの利点を提供します。そのため、メソッド定義やメンバー変数を使用せずに基本クラスを作成できる場合は、常に抽象クラスよりもインターフェイスを優先する必要があります。

実際、何かが基底クラスになることがわかっている場合、最初の選択肢はそれをインターフェイスにすることであり、メソッド定義またはメンバー変数を持たなければならない場合にのみ、抽象クラスに変更する必要があります。

于 2016-11-04T03:09:56.233 に答える
0

抽象クラスでは多重継承を実現できないため、Sun Microsystems はインターフェイスを提供しています。

2 つのクラスを拡張することはできませんが、複数のインターフェイスを実装できます。

于 2015-03-20T14:06:58.113 に答える
0

実際には、インターフェイスと抽象クラスは、サブクラスがどのようになるかを示すいくつかのコントラクト/ルールを指定するために使用されます。

ほとんどの場合、インターフェイスは純粋な抽象であることを知っています。つまり、ボディで単一のメソッドを指定できないことを意味します。この特定の点は、抽象クラスの利点です。抽象クラスでは、メソッドをボディで指定する権利とボディなしで指定する権利があることを意味します。

したがって、サブクラスについて何かを指定したい場合は、インターフェイスを使用できます。しかし、あなたのサブクラスにも何かを指定したい場合は、あなたのクラスにもいくつかの独自のメソッドが必要です。その場合、抽象クラスに行くことができます

于 2014-04-01T07:18:05.553 に答える
0

抽象クラスには抽象ではないメソッドを含めることができますが、インターフェースではすべてのメソッドが抽象であり、実装する必要があります。

これらの特定のメソッドを常に実装することがわかっている場合は、代わりにインターフェイスを使用する必要があります。また、複数のインターフェイスから継承することもできます。これは、多重継承を処理する Java の方法です。

于 2013-05-27T22:36:47.833 に答える
0

InterfaceAbstract Classは、OOP 言語で抽象化を実現する 2 つの異なる方法です。

インターフェイスは100%抽象化を提供します。つまり、すべてのメソッドは抽象的です。

抽象クラスは0 to 100%抽象化を提供します。つまり、抽象メソッドを持つ場合と持たない場合があります。

Interface型のすべての機能をクライアントで実装したい場合に使用できます。

Abstract Classいくつかの一般的な機能がAbstract Class実装者によって提供され、クライアントが実際に必要なものを実装する機会が与えられる場合に使用できます。

于 2016-07-19T19:19:24.790 に答える
0

インターフェイスと抽象化されたクラスは非常に似ているように見えますが、両者には重要な違いがあります。

抽象化は、優れた「 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>

うまくいけば、これが役に立ちます。

于 2016-11-04T23:13:40.820 に答える