あるインタビュアーから次の質問がありましたが、答えられませんでした。
抽象クラスが存在するのに、なぜインターフェイスが必要なのですか?
インターフェイスに記述しているメソッドが何であれ、Abstract クラスにも記述することができます。では、なぜインターフェイスを個別に必要とするのでしょうか?
誰か理由を教えてください。
よろしくお願いします...
あるインタビュアーから次の質問がありましたが、答えられませんでした。
抽象クラスが存在するのに、なぜインターフェイスが必要なのですか?
インターフェイスに記述しているメソッドが何であれ、Abstract クラスにも記述することができます。では、なぜインターフェイスを個別に必要とするのでしょうか?
誰か理由を教えてください。
よろしくお願いします...
いくつか違いがありますが、
インターフェイスは、クラスで使用できる「ビュー」に焦点を当てるのに最適です。このビューは、インターフェイスを実装する複数のクラスで共有できます。
たとえば、DataTableはIListSourceとISerializableを実装します。そのため、コンテキストに応じて、データを読み取るためのリスト ソースとして表示したり、インスタンスをシリアル化できるクラスとして表示したりできます。そうするときは、インスタンスの特定のビューに焦点を当てます。
インターフェースはコントラクトを表しますが、そのコントラクトのいくつかの実装を異なる (抽象) クラスで持つことができます。
public interface IExample
{
void Do();
}
public abstract class DoFirst : IExample
{
public void Do()
{
Console.WriteLine("Doing it the first way");
}
}
public abstract class DoSecond : IExample
{
public void Do()
{
Console.WriteLine("Doing it the second way");
}
}
public class DoFirstConcrete : DoFirst, IExample
{
public void DoSomethingElse()
{
Do();
Console.WriteLine("Doing something else also with first.");
}
}
public class DoSecondConcrete : DoSecond, IExample
{
public void DoSomethingElse()
{
Do();
Console.WriteLine("Doing something else also with second.");
}
}
抽象クラスは部分実装です。インターフェイスは、抽象クラスができることを知るための契約です。それを記述するにはインターフェースが必要です。
複数のインターフェイスを実装できますが、継承できるのは 1 つの抽象クラスからのみです。
インターフェイスは空のシェルであり、メソッドのシグネチャ (名前 / パラメーター / 戻り値の型) のみがあります。メソッドには何も含まれていません。インターフェイスは何もできません。あくまでもパターンです
インターフェースとは異なり、抽象クラスはクラスです。それらから継承するときに行うルックアップがあるため、使用するコストが高くなります。
抽象クラスはインターフェイスによく似ていますが、それ以上のものがあります。それらの動作を定義できます。それは、「これらのクラスはそのように見えるべきであり、共通点があるので、空白を埋めてください!」と言っている人のことです。
ここから引用されたe-satis(さらに多くの情報も): インターフェースと抽象クラスの違いは何ですか?
複数の抽象クラスから継承することはできませんが、複数のインターフェイスを実装できます。