接口和类之间的区别

时间:2013-04-07 01:40:08

标签: c# class interface

正如标题所述,我想知道使用像这样的类

之间的区别
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; }
}

我真的很困惑,因为我觉得界面没用,因为只有使用Class才可以完成所有操作。因此,我需要有人为我澄清一些事情。

2 个答案:

答案 0 :(得分:17)

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

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

因此,如果您想表达您的类遵守一个或多个合同:使用 interfaces 。但是,您无法提供实现。如果您想表达您的类某事,请扩展基类。在这种情况下,您可以提供实现,但是您只能扩展一个基类。


具体例子:

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

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

答案 1 :(得分: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!");
}

因为ConsoleLoggerMessageBoxLogger都实现了ILog接口(WriteMessage方法,所以代码的任何部分都可以使用ILog而无需了解它实际上做了什么,他们只关心它做某事 - 在这种情况下,写一条日志信息。

因此,在上面的代码中,ConsoleLoggerMessageBoxLogger可以提供给DoSomethingInteresting根本不重要,因为ILog“知道”如何说话那个对象。