JavaとC#のインターフェースと抽象クラスの違い

著者: Laura McKinney
作成日: 1 4月 2021
更新日: 17 5月 2024
Anonim
インタフェースの実装方法やメリット、抽象クラスとの違い【Java入門講座】4-8 インターフェース
ビデオ: インタフェースの実装方法やメリット、抽象クラスとの違い【Java入門講座】4-8 インターフェース

コンテンツ


インターフェイスと抽象クラスはどちらも、OOPの「不完全な型」の一因となります。 「何をすべきか」を定義するためにスーパークラスが必要な場合がありますが、「方法」ではなく、必要に応じて派生クラスによって実装される部分の方法が「インタフェース」これに対する解決策を提供します。時には、派生クラスで実装できる一般化された構造と、派生クラスで利用できる特定の構造を定義するスーパークラスクラスが必要です。抽象クラス」はこれに対する解決策を提供します。インターフェースと抽象クラスの基本的な違いは、インターフェースが完全に不完全であり、抽象クラスが部分的に不完全であることです。

  1. 比較表
  2. 定義
  3. 主な違い
  4. 結論

比較表

比較の根拠インタフェース抽象クラス
ベーシック実装についてではなく、要件についての知識しか持っていない場合は、「インターフェース」を使用します。実装について部分的に知っているときは、「抽象クラス」を使用します。
方法インターフェイスには抽象メソッドのみが含まれます。抽象クラスには、抽象メソッドと具象メソッドが含まれます。
メソッドのアクセス修飾子インターフェイスメソッドは、宣言していない場合でも、常に「パブリック」および「抽象」です。したがって、100%の純粋な抽象クラスと言えます。抽象クラスのメソッドがパブリックかつ抽象的であることは必須ではありません。具体的な方法もあります。
メソッドの制限付き修飾子インターフェイスメソッドは、次の修飾子で宣言できません。
パブリック:プライベートおよび保護
要約:最終、静的、同期、ネイティブ、strictfp。
抽象クラス変数の修飾子に制限はありません。
変数のアクセス修飾子インターフェイス変数に許可されるアクセス修飾子は、宣言されているかどうかにかかわらず、パブリック、静的、および最終です。抽象クラスの変数は、public、static、finalである必要はありません。
変数の制限された修飾子インターフェイス変数は、プライベート、保護、一時、揮発性として宣言できません。抽象クラス変数の修飾子に制限はありません。
変数の初期化インターフェイス変数は、宣言時に初期化する必要があります。宣言時に抽象クラス変数を初期化する必要はありません。
インスタンスおよび静的ブロック内部インターフェイスでは、インスタンスまたは静的ブロックを宣言できません。抽象クラスは、インスタンスまたはその内部の静的ブロックを許可します。
コンストラクターインターフェイス内でコンストラクターを宣言することはできません。抽象クラス内でコンストラクターを宣言できます。


インターフェイスの定義

Javaは多重継承を許可しません。つまり、1つのクラスが一度に複数のクラスを継承することはできません。この背後にある理由は、例を使用して説明できます。 2つの親クラスAとB、および派生クラスCがあるとします。派生クラスCは、クラスAとBの両方を継承します。現在、クラスAとBの両方にset()メソッドがあり、クラスCのset()メソッドをどのクラスに継承するかが問題になります。この問題の解決策は「インターフェース」です。

インターフェイスは純粋な抽象クラスです。インターフェイスの作成に使用されるキーワードは「インターフェイス」です。インターフェイス内のすべてのメソッドは完全に抽象的です。インターフェースは、クラスが行う必要のあることのみを指定しますが、その方法を定義しません。インターフェイス内で宣言されたすべてのメソッドが抽象であるため、インターフェイスのインスタンスは作成されません。 Javaの「インターフェース」の一般的な形式は次のとおりです。

access_specifier インタフェース interface_name {return-type method-name1(parameter-list); return-type method-name2(parameter-list);タイプfinal-varname1 = value;タイプfinal-varname2 = value; // ... return-type method-nameN(parameter-list);タイプfinal-varnameN = value; }

クラスがインターフェースを実装する必要があるため、アクセス指定子はpublicとして宣言されます。

C ++には「インターフェース」という概念がありません。しかし、JavaとC#はインターフェースを非常によく定義しています。


Javaのインターフェース:

  • インターフェイスの変数は、デフォルトでは常にパブリック、静的、および最終です。
  • 変数は、宣言時に初期化する必要があります。
  • 変数をプライベート、保護、一時、揮発性として宣言することはできません。
  • インターフェイスのメソッドは常にパブリックで抽象的ですが、プライベート、保護、最終、静的、同期、ネイティブ、strictfpとして宣言することはできません。
  • コンストラクターの主な目的はクラス変数の初期化であるため、インターフェイス内でコンストラクターを宣言することはできませんが、インターフェイス変数では宣言時に初期化されます。
  • インターフェイスは他のインターフェイスを継承できますが、そのようなインターフェイスを実装するクラスは、継承されたすべてのインターフェイスのメソッドを実装する必要があります。
  • クラスは一度に複数のインターフェイスを継承でき、継承されたすべてのインターフェイスのすべてのメソッドを実装する必要があります。

Javaでインターフェースを実装する一般的な形式:

class class_nameはInterface_name {// class-body}を実装します

インターフェイスを継承するために、クラスはキーワード「実装」を使用し、クラスは継承されたインターフェイスによって宣言されたすべてのメソッドを実装します。

C#のインターフェイス:

C#のインターフェイスは、Javaのインターフェイスとほとんど同じです。

  • C#のインターフェイスは変数を宣言しません。
  • インターフェイスの名前には、先頭に大文字のIが付き、コロン(:)記号が継承されます。

C#でインターフェイスを実装する一般的な形式:

class class_name:interface_name {//クラス本体}

抽象クラスの定義

1つ以上の抽象メソッドを含むクラスは抽象クラスと呼ばれ、クラスは、「abstract」というキーワードを使用して抽象として宣言され、クラス宣言の先頭に「class」キーワードが続きます。抽象クラスには抽象メソッドが含まれるため、不完全な型を構成します。したがって、抽象クラスのオブジェクトを作成することはできません。クラスが抽象クラスを継承する場合は、抽象クラスのすべての抽象メソッドを実装する必要があります。実装しない場合は、抽象としても宣言する必要があります。抽象属性は、抽象メソッドの完全な実装が達成されるまで継承されます。

抽象クラスには、派生クラスがそのまま利用できる具象メソッドを含めることもできます。ただし、抽象クラス内で抽象コンストラクターまたは抽象静的メソッドを宣言することはできません。 Javaの抽象クラスの一般的な形式は次のとおりです。

抽象クラスclass_name {抽象method_name1();抽象method_name2(); :return_type method_name3(parameter_list){//具体的なメソッド} return_type method_name4(parameter_list){//具体的なメソッド}};

抽象クラスの概念は、JavaとC#の両方で似ています。抽象クラスは、C ++では若干異なります。

C ++では、クラスに少なくとも1つの仮想関数がある場合、そのクラスは抽象クラスになります。キーワード「abstract」の代わりに、キーワード「virtual」を使用して抽象メソッドを宣言します。

  1. 「何が必要か」という知識はあるが「どのように実装されるか」についてはわかっていない場合は、インターフェイスを使用する必要があります。一方、必要なものがわかっていて、その実装方法が部分的にわかっている場合は、抽象クラスを使用します。
  2. インターフェイスにはすべての抽象メソッドがありますが、抽象クラスには抽象メソッドと具象メソッドがあります。
  3. インターフェイス内のメソッドはパブリックで抽象的であるため、純粋な抽象クラスとも呼ばれます。一方、アブストラクト内のメソッドは、パブリックおよびアブストラクトのみに制限されていません。
  4. インターフェイスメソッドをプライベート、保護、最終、静的、同期、ネイティブ、またはstrictfpにすることはできません。一方、抽象クラスのメソッドに制限はありません。
  5. インターフェイス内の変数は、宣言するかどうかにかかわらず、publicおよびfinalです。一方、抽象クラスの変数にはpublicおよびfinalのみであるという制限はありません。
  6. インターフェース内の変数は、プライベート保護された一時的または揮発性になることはありませんが、抽象クラスの変数には制限がありません。
  7. インターフェイスの変数は、宣言中に初期化する必要があります。一方、抽象クラスの変数はいつでも初期化できます。
  8. インターフェイス内では、インスタンスまたは静的ブロックは宣言できませんが、抽象クラス内でインスタンスまたは静的ブロックを宣言できます。
  9. インターフェイス内ではコンストラクターを定義できませんが、抽象クラス内ではコンストラクターを定義できます。

結論:

派生クラスが必要に応じて実装できるメソッドの一般化された形式を含む基本クラスを作成する必要がある場合、インターフェイスと抽象クラスの概念はそうするのに役立ちます。