差接口和类[重复]之间(Difference Between Interface and Class

2019-08-20 02:18发布

这个问题已经在这里有一个答案:

  • 是什么接口和抽象类的区别? 34个回答

正如标题状态,我想知道使用类这样的区别

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; }
}

我真的很困惑,因为我觉得界面是没用的,因为所有我可以用它做只能使用类,因此,我需要有人来澄清事情我做。

Answer 1:

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

与此相反:一是......好类对象(如在分类学)。 例如, Animal是一类生物,和Giraffe是一类动物。 继承表示这种关系:一个Giraffe AnimalGiraffe从继承Animal 。 它可以做任何一种动物可以做,等等。 它可以向其会员提供实现中,并在.NET一个类将来自恰好一个其它类继承(其为Object ,除非另有规定)。

所以,如果你想表达你的类坚持一个或多个合同:使用接口 。 但是,你不能提供一个实现。 如果你想表达你的类东西,扩展的基类。 在这种情况下,你可以提供一个实现,但你只能扩展一个基类。


对于一个具体的例子:

链表,一个数组列表,一个堆栈和一本字典有一个共同点:它们代表元素的集合。 但它们的实现是完全不同的。 它们共有的唯一的事情就是他们坚持合同: ICollection 。 这意味着你的类可以要求的集合, 任何集合 :任何实现ICollection ,无论其实施。

在另一方面:汽车,摩托车和卡车也有一个共同点:他们是轮式车辆。 但是他们有比这更是共同的:它们都有一个马达,它们都旋转他们的轮胎往前走。 从本质上讲,他们是成员的Vehicle类的对象,并可以分享他们的实现(部分)。 然而,虽然Truck可能是Vehicle CargoCarrier ,你不能在C#表达这一点。



Answer 2:

基本上:

接口提供了一个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 “知道”如何与该对象。



文章来源: Difference Between Interface and Class [duplicate]