web-dev-qa-db-ja.com

抽象クラスとインターフェースの違いは何ですか?

インターフェイスにM1()M2()の2つのメソッドがあるとします。抽象クラスにも、同じ2つの抽象メソッドがあります。このインターフェイスを実装したクラスまたは抽象クラスから継承したクラスがある場合、両方のメソッドを実装する必要があります。

だから、私のシナリオでは、インターフェースまたは抽象クラスは同じように動作するようです。だから、誰もがこれら2つの違いを強調することができますこの特定の場合ここで抽象クラスまたはインターフェースを使用するかどうかを提案しますか?

47
WpfBee

抽象クラスにはメソッド、フィールド、コンストラクタなどの実装を含めることができますが、インターフェイスにはメソッドとプロパティのプロトタイプのみが含まれるという点で、抽象クラスとインターフェイスには技術的な違いがあります。クラスは複数のインターフェースを実装できますが、継承できるのは1つのクラス(抽象またはそれ以外)のみです。

しかし、私の意見では、インターフェイスと抽象クラスの最も重要な違いはセマンティックの違いです。

インターフェイスは何かを定義しますできる(それがどのように振る舞うか)、そして抽象クラスは何かが定義されます。

たとえばIEnumerableを例にとると、この背後にある意味上の意味は、IEnumerableを実装するものはすべて列挙可能であり、列挙であることを意味するのではなく、列挙のように振る舞うことができるということです)。

対照的に、洗濯機の例では、それを継承するものはすべて洗濯機の一種です。それを継承するものは、洗濯機、トップローダー、またはサイドローダーなどのタイプになります。

代わりに、ICanWashというインターフェイスがあり、Washというメソッドを含めることができます。 ICanWash、さまざまなものにPerson、抽象洗濯機クラスなどを実装させることができますが、実際の実装は重要ではありません。物を洗えます.

要約すると、クラスは何かを定義し、インターフェイスは何かができることを定義します。

123
Matthew

[〜#〜] msdn [〜#〜] から:

インターフェイスを使用すると、たとえば、クラスに複数のソースからの動作を含めることができます。言語はクラスの多重継承をサポートしないため、その機能はC#で重要です

そのため、クラスがそのメソッドを継承できるようにする場合は、インターフェイスを使用します。

同じMSDNページから:

さらに、構造体は別の構造体またはクラスから実際に継承できないため、構造体の継承をシミュレートする場合は、インターフェイスを使用する必要があります。

3
Fabio

インターフェイスでは、クラスが複数のインターフェイスを継承/実装できますが、C#では1つのクラスからしか継承できません。

基本的に、多重継承。

1
CharlesW

抽象クラスは抽象メソッドを保持するだけでなく、実装を持つ他のフィールドやメソッドも保持する場合があります。 C#では、マルチプルクラスから継承することはできませんが、マルチプルインターフェイスを実装することはできます。簡単な答えは次のとおりです。可能な限り、抽象クラスではなくインターフェイスを使用します。あなたの例では、インターフェースを使用することが推奨されています。

1
omer schleifer

インターフェイスと抽象クラスの違いに関する2つの簡単な考え:

  1. 抽象クラスは拡張できるため、将来の拡張が予想される場合は抽象クラスが望ましいが、別のインターフェイスI2を追加してインターフェイスを拡張する必要があります。
  2. 単一(実装)継承とは、真の基本的な性質を最も密接に反映するために、抽象クラスを慎重に選択することを意味します。インターフェイスは実装に簡単に追加できますが、抽象クラスはまだ実装されていない場合にのみ追加できます。
1
Pieter Geerkens