インターフェイスにM1()
とM2()
の2つのメソッドがあるとします。抽象クラスにも、同じ2つの抽象メソッドがあります。このインターフェイスを実装したクラスまたは抽象クラスから継承したクラスがある場合、両方のメソッドを実装する必要があります。
だから、私のシナリオでは、インターフェースまたは抽象クラスは同じように動作するようです。だから、誰もがこれら2つの違いを強調することができますこの特定の場合ここで抽象クラスまたはインターフェースを使用するかどうかを提案しますか?
抽象クラスにはメソッド、フィールド、コンストラクタなどの実装を含めることができますが、インターフェイスにはメソッドとプロパティのプロトタイプのみが含まれるという点で、抽象クラスとインターフェイスには技術的な違いがあります。クラスは複数のインターフェースを実装できますが、継承できるのは1つのクラス(抽象またはそれ以外)のみです。
しかし、私の意見では、インターフェイスと抽象クラスの最も重要な違いはセマンティックの違いです。
インターフェイスは何かを定義しますできる(それがどのように振る舞うか)、そして抽象クラスは何かが定義されます。
たとえばIEnumerable
を例にとると、この背後にある意味上の意味は、IEnumerable
を実装するものはすべて列挙可能であり、列挙であることを意味するのではなく、列挙のように振る舞うことができるということです)。
対照的に、洗濯機の例では、それを継承するものはすべて洗濯機の一種です。それを継承するものは、洗濯機、トップローダー、またはサイドローダーなどのタイプになります。
代わりに、ICanWash
というインターフェイスがあり、Wash
というメソッドを含めることができます。 ICanWash
、さまざまなものにPerson
、抽象洗濯機クラスなどを実装させることができますが、実際の実装は重要ではありません。物を洗えます.
要約すると、クラスは何かを定義し、インターフェイスは何かができることを定義します。
[〜#〜] msdn [〜#〜] から:
インターフェイスを使用すると、たとえば、クラスに複数のソースからの動作を含めることができます。言語はクラスの多重継承をサポートしないため、その機能はC#で重要です
そのため、クラスがそのメソッドを継承できるようにする場合は、インターフェイスを使用します。
同じMSDNページから:
さらに、構造体は別の構造体またはクラスから実際に継承できないため、構造体の継承をシミュレートする場合は、インターフェイスを使用する必要があります。
インターフェイスでは、クラスが複数のインターフェイスを継承/実装できますが、C#では1つのクラスからしか継承できません。
基本的に、多重継承。
抽象クラスは抽象メソッドを保持するだけでなく、実装を持つ他のフィールドやメソッドも保持する場合があります。 C#では、マルチプルクラスから継承することはできませんが、マルチプルインターフェイスを実装することはできます。簡単な答えは次のとおりです。可能な限り、抽象クラスではなくインターフェイスを使用します。あなたの例では、インターフェースを使用することが推奨されています。
インターフェイスと抽象クラスの違いに関する2つの簡単な考え: