web-dev-qa-db-ja.com

簡単に言えば、抽象クラスやインターフェイスの目的は何ですか?

一部の学生には抽象的なクラスとインターフェースの使用について説明する必要があります。私は非常に技術的な背景を持っているため、ジュニア向けの簡単な説明を定義するのを手伝ってくれるかどうか知りたいです。

簡単な定義:

抽象クラ​​ス、インターフェースの目的は何ですか?2つの違いは何ですか?

一方を他方の代わりに使用するのが適切な場合はいつですか?

ありがとう。

25
GibboK

あまり手を振ることなく、一般的な用語でこれを行うことができるかどうかを確認します。

interfaceは契約のようなものです。これは、インターフェースを実装するクラスが、そのインターフェースによって宣言されたすべての関数(シグニチャーとしてのみ、関数定義ではない)の実装に同意することを示しています。クラスは、宣言された関数のそれぞれを実装する限り、選択した方法でこれを行い、他の機能を提供します。インターフェイスは、その他の関係のないクラスのいくつかの一般的な機能を使用できるようにする場合に役立ちます。これらのクラスは、実装の詳細を共有せず、関数シグネチャのみを共有します。 C#では、interface内の関数宣言は暗黙的に純粋仮想です。

抽象クラ​​スは、をインスタンス化できない部分的に定義されたクラスです。 (通常)いくつかの実装が含まれていますが、一部の関数は、シグネチャによってのみ宣言された純粋なvirtual-のままです。純粋な仮想関数は、それらを宣言するクラスで定義されていないため、サブクラスで実装する必要があります(抽象クラ​​スでない限り)。すべての純粋仮想関数を定義するサブクラスのみをインスタンス化できます。抽象クラスの目的は、クラス全体を実装せずに、複数のサブクラスによって継承できるいくつかの一般的な動作を定義することです。 C#では、abstractキーワードは、抽象クラスと純粋仮想メソッドの両方を指定します。

実際には、2つの違いは、インターフェイスは純粋な仮想関数のみを定義するのに対して、抽象クラスには具象関数、メンバー、またはクラスの他の側面も含まれる場合があることです。

32

インターフェイスは、このクラスがこれらの関数をサポートするであることをユーザーに伝えます。

例えば:

public interface IWorker
{
    void DoWork();
}
public class MyInformation : IWorker
{
    public void DoWork()
    {
        //Do your class-specific Work 
    }
}

var info = new MyInformation();
info.DoWork();

ここで質問するかもしれません-インターフェースを実装するのではなく、MyInformationにメソッドを追加しないのはなぜですか?

これが役立つ状況を以下に示します。

List<IWorker> workers = GetWorkers();
foreach(var worker in workers)
    worker.DoWork();

ここでは、どのようなオブジェクトを受け取っているのかわかりません。私たちが知っているのは、それらがIWorkerで定義されたメソッドのいずれかを実装することだけです。彼らのやり方は気にしません-私たちが気にするのは、彼らがあなたの電話をサポートすることだけです。

抽象クラスについて:

public abstract class Serializer
{
    protected void GetAttributes()
    {
        //Some default implementation
    }
    public abstract void SaveObject(String outputPath);
}

いくつかの基本的なデフォルト実装を持つシリアライザクラスがありますが、それだけでは何もしません。出力の書き方はわかりません。属性情報の取得方法だけがわかります。

これで、次のような具体的な実装が可能になります。

public class XmlSerializer : Serializer
{
    public override void SaveObject(String outputPath)
    {
        //Do your xml serializing
    }
}

XMLにシリアル化します。

繰り返しますが、シリアル化の方法は気にせず、シリアル化するだけです。

List<Serializer> serializers = GetWorkers();
foreach(var serializer in serializers)
    serializer.SaveObject(@"C:\out.tmp");
20
Rob

インターフェースはスケルトンのようなものです。人間を構築したい場合は、そのスケルトンを使用する必要があります。

インターフェースは、クラスが定義済みの合意済みの構造を持つ必要があることを示すために、クラスの一種の構造を作成するだけです。たとえば、すべての動物はおしっこをし、食べ、音を出します。したがって、クラスがIAnimalPee、およびEatである必要があることのみを説明するMakeSoundと呼ばれるインターフェイスを持つことができます。

インターフェースは単純なチェックリストのようなもので、完全に実装するか、まったく実装しないかのどちらかです。 IAnimalインターフェースを使用したいときは、上司に「食べて、おしっこして、音を出すためのメソッドを書かない限り、Catクラスを作成しないでください」と言われるのと同じです。

抽象クラスはスケルトンに似ていますが、いくつかの肉も含まれています。作業を簡単にするためだけにあります。

抽象クラスは、すでに実装されているインターフェースであると考えることができます。

それは明白な英語の答えでした。しかし、それを理解した後、本当のコンセプトを得るために、もっと勉強してください。

12
Saeed Neamati

シンプルに頑張ります。

抽象クラスはクラスです。抽象クラスのオブジェクトを作成できないのは特別なことです。呼ばれる具象クラスの非抽象クラス。

クラスである抽象クラスは、フィールド、プロパティ、メソッドイベント、インデクサーなどの通常の要素を持つことができます。オブジェクトを作成するために抽象クラスがインスタンス化されないことが保証されているため、これらの要素の一部は、実装(例:ボディのないメソッド)。

インターフェイスは、他のクラスが確実に持つメンバーの説明です。 C#インターフェイスは、メソッド、プロパティ、インデクサー、イベントのみを記述できます。

クラスがインターフェースを実装する場合、そのクラスはインターフェースによって記述されるすべてのメンバーを実装する必要があります。
これは、インターフェイスを実装するクラスが、そのインターフェイスによって記述されるすべてのメンバーを実装しない場合、そのようなクラスは抽象クラスでなければならないことを意味します!

抽象クラスは「ハーフクック」クラスにすることができます。つまり、ボディを備えたメソッドはほとんどありませんが、ボディを持たないメソッドはほとんどありません。インターフェイスは、それが記述するメンバーを実装できません。

抽象クラスは、継承に基づくクラスの階層に参加します。 C#では、クラスは抽象である場合もない場合もある最大で1つの親クラスを持つことができることに注意してください。

クラスは同時に多くのインターフェースを実装できます。

それらの両方の多くのユースケースがあります。

次のステートメントは、より明確にする必要があります。

  • クラスは抽象または具象でなければなりません。
  • インターフェイスは、定義により、抽象的です。
  • インターフェイスも抽象クラスもインスタンス化できません。

  • クラスはゼロまたは1つの(抽象または具象)クラスから継承できます。

  • クラスは0個以上のインターフェースを実装できます。
  • インターフェイスは0個以上のインターフェイスから継承する場合があります。

  • インターフェイスはクラスを継承できません。

  • 抽象クラスは実装を持つメンバーを持つことができます。

  • インターフェイスには、実装を持つメンバーを含めることはできません。

  • 具体的には、クラスはすべてのメンバーをインターフェースに実装する必要があります。

これがお役に立てば幸いです。

3
isntn