15

タイトルが示すように、このようなクラスを使用することの違いを知りたいです

public class Account
{
    public string Username { get; set; }
    public string Password { get; set; }
}

このようなインターフェイスを使用して

public class Account : IAccount
{
    public string Username { get; set; }
    public string Password { get; set; }
}

public interface IAccount
{
    string Username { get; set; }
    string Password { get; set; }
}

インターフェイスでできることはすべてクラスを使用してのみ実行できるため、インターフェイスが役に立たないことがわかったので、私は本当に混乱しています。したがって、誰かが私のために物事を明確にする必要があります。

4

2 に答える 2

22

インターフェイスはコントラクトです。インターフェイスを実装するクラスが持つ必要のあるメンバー (メソッドとプロパティ) を指定します。ただし、これは単なるコントラクトであるため、そのメンバーの実装はありません。クラスは、ゼロ、1 つ、または複数のインターフェイスを実装できます。

対照的に、クラスは...まあ...オブジェクトのクラスです(分類法のように)。たとえば、Animalは生物のクラスであり、 aGiraffeは動物のクラスです。継承Giraffe この関係を表していAnimalます。動物ができることは何でもできます。メンバーの実装を提供できます。.NET では、クラスは他の 1 つのクラスから継承します (特に指定がない限り)。GiraffeAnimalObject

したがって、クラスが 1 つまたは複数のコントラクトに準拠していることを表現したい場合は、interfacesを使用します。ただし、実装を提供することはできません。クラスが何かであることを表現したい場合は、基本クラスを拡張します。その場合、実装を提供できますが、拡張できる基本クラスは1 つだけです。


具体的な例:

リンクされたリスト、配列リスト、スタック、および辞書には共通点があります。それらは要素のコレクションを表します。しかし、それらの実装は完全に異なります。唯一の共通点は、彼らが遵守している契約です: ICollection. これは、クラスがコレクション、任意のコレクション、つまり実装ICollectionに関係なく実装するものを要求できることを意味します。

一方、車、オートバイ、トラックにも共通点があります。これらは車輪付きの車両です。しかし、それ以上の共通点があります。すべてにモーターがあり、タイヤを回転させて前進します。Vehicle基本的に、それらはオブジェクトのクラスのメンバーであり、実装 (の一部) を共有できます。ただし、 aは aaTruckかもしれませんが、これを C# で表現することはできません。Vehicle CargoCarrier

于 2013-04-07T01:46:15.203 に答える
15

基本的:

インターフェイスはcontract、オブジェクトと対話する方法を指定しますが、そのオブジェクトがその要求を処理する方法の詳細は提供しません (パラメーターや戻り値の型などを除く)。

と:

クラス (特に抽象クラス) は、オブジェクトと対話する方法に関する情報と、場合によっては実際の実装 (基本クラスのメソッドをオーバーライドすることを考えてください) の両方を提供します。

インターフェイスを使用すると、オブジェクトがどのように動作するかを気にすることなく、オブジェクト間の通信の一般的な形式を定義できます。

例はロギングです:

public interface ILog
{
   void WriteMessage(string message);
}

public class ConsoleLogger : ILog
{
   public void WriteMessage(string message)
   {
      Console.WriteLine(message);
   }
}

public class MessageBoxLogger : ILog
{
   public void WriteMessage(string message)
   {
      MessageBox.Show(message);
   }
}

public void DoSomethingInteresting(ILog logger)
{
   logger.WriteMessage("I'm doing something interesting!");
}

と の両方がインターフェイス (メソッド)ConsoleLoggerMessageBoxLogger実装しているため、コードのどの部分でも、それが実際に何をするかを知る必要はなく、何かを行うこと(この場合はログ メッセージの書き込み) だけを気にします。ILogWriteMessageILog

したがって、上記のコードでは、がそのオブジェクトと対話する方法を「知っている」ため、ConsoleLoggerまたはMessageBoxLoggerを指定しDoSomethingInterestingてもまったく問題ありません。ILog

于 2013-04-07T01:46:04.523 に答える