メソッド宣言がほとんどないインターフェイスがあり、同様のメソッド (インターフェイスで宣言されている) が抽象クラスの抽象メソッドとして宣言されているとします。どちらも、基本クラスのすべてのメソッドを継承して強制的に実装するなど、同じ目的を果たします。では、C#に関してそれらの主な違いは何ですか。面接でよく聞かれます。
4 に答える
すべての抽象メソッドとインターフェースを持つ抽象クラスには、主に 2 つの違いがあります。
1. Multiple Inheritance. - Your class can inherit as more than one interface.
But this is not possible to inherit multiple class in c# because famous diamond problem.
2. Interface will help you to Dependency Injection Problem.
You can check DI problem here -
この質問は、JAVA または C# に関連していると思います。C++ では、抽象クラスはインターフェイスとも呼ばれます。ただし、インターフェイス クラスと抽象クラスの違いに固執しましょう (Java では、たとえば):
- インターフェイスと抽象クラスの両方が、一連のメソッドとプロパティを提供します。これらは、使用する前に拡張する必要があります。
- 多重継承はインターフェイスを介してのみサポートされます。複数のインターフェイスを拡張できますが、継承できるのは 1 つのクラスからのみです (抽象クラスにも適用されます)。
- 抽象クラスは、いくつかのメソッドの実装と他の抽象化を提供できますが、インターフェースは、それらを拡張するクラスで実装する必要がある抽象化のみを提供します。
どちらの方がよいですか?アプリケーションによって異なります。たとえば、一部の設計パターンはインターフェースでうまく機能し、他のものは抽象クラスにより適しています
違いは言語によって異なります。
Java では、1 つの抽象クラスからクラスを派生させることができますが、多くのインターフェイスからも派生させることができます。Java 8 では、インターフェースもデフォルトのメソッドを持つことができ、それらと抽象クラスの違いはほとんど唯一のものです。
SmallTalk では、すべてのクラスがインターフェイスとして機能するため、インターフェイスはまったく使用されません。
C++ では違いは明確ではなく、抽象クラスまたはインターフェイスを自由に使用できます。インターフェースは抽象クラスの場合があります。
2 つの親クラスを持つことに関する技術的な問題のために、インターフェイスが表示されたことを忘れないでください。そして、あなたは理論について話している。抽象理論では、クラスとは別にインターフェースは必要なく、あなたの質問は意味を失います。SmallTalk など、実際の OOP 言語でも同じです。
C# では、私の知る限り、すべてのメソッドが抽象化されている Abstract クラスと Interface の間に大きな違いはありません。これら (抽象クラスまたはインターフェイス) から継承するすべてのクラスは、宣言されたメソッドを実装する必要があります。
ただし、インターフェイスからの継承の場合は複数のインターフェイスを持つことができますが、抽象クラスの場合は 1 つしか持つことができません。
したがって、抽象クラスに抽象メソッドのみを持たせる代わりに、それを Interface として宣言します。
ただし、インターフェイス間の継承を制限したい場合は、両方を抽象メソッドのみを持つ抽象クラスとして宣言して、消費者がどちらかからしか継承できないようにします。