接口和类之间的区别

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

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

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

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

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


举个具体的例子:

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

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

基本上:

接口提供了一个指定如何与对象通信的contract ,但没有提供该对象如何处理该请求的细节(除了参数和返回类型等)

和:

类(尤其是抽象类)提供了有关如何与对象进行通信的信息,但在某些情况下提供了实际实现(考虑覆盖基类的方法)。

接口允许您定义对象之间通信的通用forms,而无需关心它们如何执行操作的具体细节。

一个例子是记录:

 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 “知道”如何与该对象通信。