50

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

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

4

5 に答える 5

137

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

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

インターフェイスは何かができること(それがどのように動作するか)を定義し、抽象クラスは何かが何であるかを定義します。

たとえばIEnumerable、この背後にある意味的な意味は、実装するものIEnumerableはすべて列挙可能であるということです。これは、列挙であることを意味するのではなく、1つのように動作できる(列挙できる)ことを意味します。

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

代わりに、というインターフェイスがICanWashあり、これには。というメソッドが含まれている可能性がありますWash。実際の実装が重要ではない場合、さまざまなものを実装することができICanWashます。それはPerson、抽象的な洗濯機クラスなどです。動作は、物を洗うことができるということを知っておく必要があります。

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

于 2013-03-02T19:11:16.013 に答える
3

MSDNから:

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

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

同じMSDNページから:

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

于 2013-03-02T19:14:58.643 に答える
1

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

基本的に多重継承。

于 2013-03-02T19:09:33.283 に答える
1

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

于 2013-03-02T19:12:36.970 に答える
1

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

  1. 抽象クラスは拡張できるため、将来の拡張が可能である場合は抽象クラスが必要ですが、別のインターフェイスI2を追加してインターフェイスを拡張する必要があります。
  2. 単一(実装)継承とは、真の基本的な性質を最も厳密に反映するために、抽象クラスを慎重に選択することを意味します。インターフェイスは実装に簡単に追加できますが、抽象クラスはまだ追加されていない場合にのみ追加できます。
于 2013-03-02T19:13:11.317 に答える