18

あるインタビュアーから次の質問がありましたが、答えられませんでした。

抽象クラスが存在するのに、なぜインターフェイスが必要なのですか?

インターフェイスに記述しているメソッドが何であれ、Abstract クラスにも記述することができます。では、なぜインターフェイスを個別に必要とするのでしょうか?

誰か理由を教えてください。

よろしくお願いします...

4

5 に答える 5

17

いくつか違いがありますが、

  • 抽象クラスは親クラスを 1 つしか持つことができませんが、クラスは複数のインターフェイスを実装できます。
  • インターフェイスには実装を含めることはできませんが、抽象クラスには実装を含めることができます (非抽象メソッドに加えて抽象メソッドを含めることができます)。

インターフェイスは、クラスで使用できる「ビュー」に焦点を当てるのに最適です。このビューは、インターフェイスを実装する複数のクラスで共有できます。

たとえば、DataTableはIListSourceISerializableを実装します。そのため、コンテキストに応じて、データを読み取るためのリスト ソースとして表示したり、インスタンスをシリアル化できるクラスとして表示したりできます。そうするときは、インスタンスの特定のビューに焦点を当てます。

于 2013-05-29T16:04:42.577 に答える
11

インターフェースはコントラクトを表しますが、そのコントラクトのいくつかの実装を異なる (抽象) クラスで持つことができます。

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.");
    }
}
于 2013-05-29T16:05:09.827 に答える
8

抽象クラスは部分実装です。インターフェイスは、抽象クラスができることを知るための契約です。それを記述するにはインターフェースが必要です。

于 2013-05-29T16:06:59.103 に答える
5

複数のインターフェイスを実装できますが、継承できるのは 1 つの抽象クラスからのみです。

インターフェイスは空のシェルであり、メソッドのシグネチャ (名前 / パラメーター / 戻り値の型) のみがあります。メソッドには何も含まれていません。インターフェイスは何もできません。あくまでもパターンです

インターフェースとは異なり、抽象クラスはクラスです。それらから継承するときに行うルックアップがあるため、使用するコストが高くなります。

抽象クラスはインターフェイスによく似ていますが、それ以上のものがあります。それらの動作を定義できます。それは、「これらのクラスはそのように見えるべきであり、共通点があるので、空白を埋めてください!」と言っている人のことです。

ここから引用されたe-satis(さらに多くの情報も): インターフェースと抽象クラスの違いは何ですか?

于 2013-05-29T16:07:08.933 に答える
0

複数の抽象クラスから継承することはできませんが、複数のインターフェイスを実装できます。

于 2013-05-29T16:08:03.570 に答える