正如标题所述,我想知道使用像这样的类
之间的区别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才可以完成所有操作。因此,我需要有人为我澄清一些事情。
答案 0 :(得分:17)
接口是合同:它指定实现接口必须的类的成员(方法和属性)。但因为它只是一份合同,所以它的任何成员都没有实施。一个类可以实现零个,一个或多个接口。
相比之下:类是......井......对象类(如分类法)。例如,Animal
是一类生物,Giraffe
是一类动物。继承表达了这种关系:当Giraffe
从Animal
继承时,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!");
}
因为ConsoleLogger
和MessageBoxLogger
都实现了ILog
接口(WriteMessage
方法,所以代码的任何部分都可以使用ILog
而无需了解它实际上做了什么,他们只关心它做某事 - 在这种情况下,写一条日志信息。
因此,在上面的代码中,ConsoleLogger
或MessageBoxLogger
可以提供给DoSomethingInteresting
根本不重要,因为ILog
“知道”如何说话那个对象。