接口和类之间的区别

Dan*_*gen 9 c# interface class

正如标题所述,我想知道使用这样的类之间的区别

public class Account
{
    public string Username { get; set; }
    public string Password { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

并使用和接口这样

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; }
}
Run Code Online (Sandbox Code Playgroud)

我真的很困惑,因为我发现接口是无用的,因为我可以用它做的只能使用Class,因此,我需要有人为我澄清一些事情.

Dan*_*ker 18

接口是契约:它指定实现接口的类必须具有的成员(方法和属性).但因为它只是一份合同,所以它的任何成员都没有实施.一个类可以实现零个,一个或多个接口.

相比之下:一个是......好......一类对象(比如分类法).例如,a Animal是一类生物,a Giraffe是一类动物.继承表示这种关系:一个Giraffe AnimalGiraffe从继承Animal.它可以做动物可以做的任何事情,甚至更多.它可以为其成员提供实现,而在.NET中,类将从其他一个类继承(Object除非另有说明).

因此,如果您想表达您的类遵守一个或多个合同:使用接口.但是,您无法提供实施.如果你想表达你的类什么,扩展一个基类.在这种情况下,您可以提供实现,但是您只能扩展一个基类.


举个具体的例子:

链表,数组列表,堆栈和字典有一些共同点:它们代表元素的集合.但他们的实现完全不同.他们唯一的共同点是他们坚持的合同:ICollection.这意味着您的类可以请求集合,任何集合:任何实现的集合ICollection,无论其实现如何.

另一方面:汽车,摩托车和卡车也有一些共同点:它们是轮式车辆.但他们有更多共同之处:他们都有一个发动机,他们全都旋转轮胎前进.从本质上讲,它们是Vehicle对象类的成员,并且可以共享(部分)其实现.但是,虽然a Truck可能是a Vehicle a CargoCarrier,但你无法用C#表达.


Cli*_*int 13

基本上:

接口提供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!");
}
Run Code Online (Sandbox Code Playgroud)

因为无论ConsoleLoggerMessageBoxLogger实现ILog接口(该WriteMessage方法,代码的任何部分都可以采取ILog甚至无需知道它实际上做,他们只关心它的东西 -在这种情况下,写日志信息.

因此,在上面的代码中,a ConsoleLogger或者MessageBoxLogger可以提供给DoSomethingInteresting它并不重要,因为ILog"知道"如何与该对象通信.