【问题标题】:Difference Between Interface and Class [duplicate]接口和类之间的区别[重复]
【发布时间】:2013-03-29 06:55:16
【问题描述】:

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

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 来完成,因此,我需要有人为我澄清事情。

【问题讨论】:

  • 这应该会有所帮助:stackoverflow.com/questions/2271104/class-vs-interface。请记住谷歌是你的朋友
  • 我要打一个例子.. 但实际上,任何教程/书籍都涵盖了这类问题..
  • 您似乎掌握了情况。接口是一种契约。类是契约的一种实现。
  • 没关系..那个链接比我要输入的要好:)

标签: c# class interface


【解决方案1】:

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

相比之下:class 是一个……嗯……对象的类别(就像在分类学中一样)。例如,Animal 是一类生物,Giraffe 是一类动物。继承表达了这种关系:当Giraffe 继承自Animal 时,Giraffe 是一个 Animal。它可以做任何动物可以做的事情,甚至更多。它可以为其成员提供实现,并且在 .NET 中,一个类将完全继承自另一个类(除非另有说明,否则它是 Object)。

所以,如果你想表达你的类遵守一个或多个契约:使用接口。但是,您无法提供实现。如果你想表达你的类的东西,扩展一个基类。在这种情况下,您可以提供一个实现,但您只能扩展 一个 基类。


举个具体的例子:

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

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

【讨论】:

  • 所以基本上,在 C++ 可以有多个基类的地方,C# 不能通过使用基本上是纯虚拟 C++ 类的接口来解决这个问题,对吗?
【解决方案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 接口(@98​​7654326@ 方法,所以代码的任何部分都可以使用ILog 而无需知道它实际上做了什么,他们只关心它某事 - 在这种情况下,写一条日志消息。

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

【讨论】:

    猜你喜欢
    • 2011-04-07
    • 1970-01-01
    • 2011-12-28
    • 1970-01-01
    • 2021-08-28
    • 2011-03-23
    • 2023-03-15
    • 2014-05-16
    • 1970-01-01
    相关资源
    最近更新 更多