接口和类的区别

这个问题在这里已经有了答案:

  • 界面和抽象类有什么区别? 32个答案

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

    相比之下:一个类是一个......好的......类的对象(如分类法)。 例如, Animal是一类生物,而Giraffe则是一类动物。 继承表示这种关系:一个GiraffeAnimalGiraffe从继承Animal 。 它可以做任何动物可以做的事,等等。 它可以为其成员提供实现,而在.NET中,一个类将从另一个类继承(除非另有指定,否则为Object )。

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


    举一个具体的例子:

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

    另一方面,汽车,摩托车和卡车也有一些共同点:它们是轮式车辆。 但他们有更多的共同点:他们都有一个电机,他们都旋转轮胎前进。 实质上,它们是Vehicle类对象的成员,并且可以共享(部分)它们的实现。 然而,虽然Truck可能是VehicleCargoCarrier ,但您无法在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!");
    }
    

    因为ConsoleLoggerMessageBoxLogger实现了ILog接口( WriteMessage方法,所以任何代码部分都可以在不需要知道实际内容的情况下采用ILog ,他们只关心它做了什么 - 在这种情况下写日志消息。

    因此,在上面的代码中, ConsoleLoggerMessageBoxLogger可以提供给DoSomethingInteresting这根本就不重要,因为ILog “知道”如何与该对象进行对话。

    链接地址: http://www.djcxy.com/p/54245.html

    上一篇: Difference Between Interface and Class

    下一篇: What's the difference between an abstract class and an interface?