正如标题状态,我想知道使用类这样的区别
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; }
}
我真的很困惑,因为我觉得界面是没用的,因为所有我可以用它做只能使用类,因此,我需要有人来澄清事情我做。
接口是一个合同 :它规定了什么成员(方法和属性)实现接口的类必须有。 但是因为它只是一个合约,它有它的任何成员没有实现。 一个类可以实现零个,一个或多个接口。
与此相反:一类是......好类对象(如在分类学)。 例如, Animal
是一类生物,和Giraffe
是一类动物。 继承表示这种关系:一个Giraffe
是 Animal
当Giraffe
从继承Animal
。 它可以做任何一种动物可以做,等等。 它可以向其会员提供实现中,并在.NET一个类将来自恰好一个其它类继承(其为Object
,除非另有规定)。
所以,如果你想表达你的类坚持一个或多个合同:使用接口 。 但是,你不能提供一个实现。 如果你想表达你的类的东西,扩展的基类。 在这种情况下,你可以提供一个实现,但你只能扩展一个基类。
对于一个具体的例子:
链表,一个数组列表,一个堆栈和一本字典有一个共同点:它们代表元素的集合。 但它们的实现是完全不同的。 它们共有的唯一的事情就是他们坚持合同: ICollection
。 这意味着你的类可以要求的集合, 任何集合 :任何实现ICollection
,无论其实施。
在另一方面:汽车,摩托车和卡车也有一个共同点:他们是轮式车辆。 但是他们有比这更是共同的:它们都有一个马达,它们都旋转他们的轮胎往前走。 从本质上讲,他们是成员的Vehicle
类的对象,并可以分享他们的实现(部分)。 然而,虽然Truck
可能是Vehicle
和 CargoCarrier
,你不能在C#表达这一点。
基本上:
接口提供了一个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
“知道”如何与该对象。