接口和类的区别
这个问题在这里已经有了答案:
接口是一个契约:它指定实现接口的类必须具有哪些成员(方法和属性)。 但是因为它只是一个合约,它没有任何成员的实现。 一个类可以实现零个,一个或多个接口。
相比之下:一个类是一个......好的......类的对象(如分类法)。 例如, 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
“知道”如何与该对象进行对话。
上一篇: Difference Between Interface and Class
下一篇: What's the difference between an abstract class and an interface?