关于C:接口和类之间的区别

Difference Between Interface and Class

本问题已经有最佳答案,请猛点这里访问。

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

1
2
3
4
5
public class Account
{
    public string Username { get; set; }
    public string Password { get; set; }
}

像这样的使用和接口

1
2
3
4
5
6
7
8
9
10
11
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; }
}

我真的很困惑,因为我发现接口是无用的,因为我用它所能做的一切只能用类来完成,因此,我需要有人为我澄清一些事情。


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

相反:一门课是…好。。。对象类(如在分类法中)。例如,Animal是一类生物,Giraffe是一类动物。继承表示这种关系:当GiraffeAnimal继承时,Giraffe就是Animal。它可以做任何动物能做的事,等等。它可以为其成员提供实现,并且在.NET中,一个类只能从另一个类继承(除非另有规定,否则为Object)。

因此,如果您想表示您的类遵循一个或多个契约:使用接口。但是,您不能提供实现。如果你想表达你的类是什么,扩展一个基类。在这种情况下,您可以提供一个实现,但只能扩展一个基类。

例如:

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

另一方面,汽车、摩托车和卡车也有一些共同点:它们是轮式车辆。但他们有更多的共同点:他们都有一台发动机,他们都转动轮胎前进。本质上,它们是Vehicle类对象的成员,可以共享(部分)它们的实现。然而,虽然Truck可以是VehicleCargoCarrier两种形式,但不能用c表示。


基本上:

An interface provides a contract specifying how to talk to an object, but not the specifics of how that object handles that request (apart from parameters and return types etc)

还有:

A class (especially an abstract class) provides both the information on how to talk to an object, but in some cases the actual implementation (think overriding a method of a base class).

接口允许您定义对象之间通信的通用形式,而不需要关心对象如何处理这些事情的细节。

例如日志记录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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而不必知道它实际做了什么,它们只关心它做了什么——在这种情况下,写日志消息。

所以在上面的代码中,可以向DoSomethingInteresting提供ConsoleLoggerMessageBoxLogger,这一点无关紧要,因为ILog知道如何与该对象对话。