• c#接口和抽象类对比学习


    什么是接口?

    接口就是一种规范,协议(*),约定好遵守某种规范就可以写通用的代码。

    定义了一组具有各种功能的方法。接口描述的是一种能力,具有这种能力的事物可以没任何关系。比如:

    public interface  IFly{void fly();}

    实现这个接口的可以是飞机,鸟等,他们都有飞的能力但没什么关系。而抽象类就不同了。

    接口解决了类的多继承的问题

         接口解决了类继承以后体积庞大的问题。

         接口之间可以实现多继承

    接口中的成员必须不能有实现(没实现说白了就是不能有大括号哦),接口不能实例化。

    接口中的成员不能有访问修饰符,隐式公开public

    接口中可以有属性、方法、索引器等(其实都是方法,可以用Reflector反编译看),但不能有字段

    接口中的所有成员必须被子类中全部实现

    接口的特点总结

       1.接口是一种规范。为了多态。

       2.接口不能被实例化。

       3.接口中的成员不能加“访问修饰符”,接口中的成员访问修饰符为public,

         不能修改。(默认为public)

       4.接口中的成员不能有任何实现(“光说不做”,只是定义了一组未实现的成员)。

       5.接口中只能有方法、属性、索引器、事件,不能有“字段”。

       6.接口与接口之间可以继承,并且可以多继承。

       7.实现接口的子类必须实现该接口的全部成员。

       8.一个类可以同时继承一个类并实现多个接口,如果一个子类同时继承了父类A,

         并实现了接口IA,那么语法上A必须写在IA的前面。class MyClass:A,IA{},因为类是单继承的。

       9.当一个抽象类实现接口的时候,如果不想把接口中的成员实现,可以把该成员实现为abstract。(抽象类也能实现接口,用abstrac标记)

       10.“显示实现接口”,只能通过接口变量来调用(因为显示实现接口后成员为private)。

     

    在编程时:

       接口→抽象类→父类→具体类(在定义方法参数、返回值、声明变量的时候能用抽象就不要用具体。)

       能使用接口就不用抽象类,能使用抽象类就不用类,能用父类就不用子类。

       避免定义“体积庞大的接口”、“多功能接口”,会造成“接口污染”。只把相关联的一组成员定义到一个接口中(尽量在接口中少定义成员)。单一职责原则

       定义多个职责单一的接口(小接口)(组合使用)。

    抽象类和接口的区别

    接口定义类的公共行为,抽象类定义类的公共实现

    一个类只能继承自一个类(抽象类),但是可以同时实现多个接口

    接口中不能有实现,抽象类中可以有未实现成员也可以有实现的成员

    接口中未实现的方法必须在子类中实现,抽象类中未实现的成员必须在子类中重写

    好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。

    如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。  如: 

     

     1   Public interface  IFly
     2 
     3  4 
     5     void fly();
     6 
     7      void eat();
     8 
     9 10 
    11 Class Plane:IFly
    12 
    13 {
    14 
    15     //类实现了接口,必须实现它的所有未实现的成员,所以飞机必须也得有eat的方法。如果您说飞机吃油,那也没办法。
    16 
    17      void fly(){…};
    18 
    19        void eat(){…..};
    20 }

    什么时候使用抽象类,什么时候使用接口

    抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。

  • 相关阅读:
    SpringCloud学习笔记(3)----Spring Cloud Netflix之深入理解Eureka
    SpringCloud学习笔记(2)----Spring Cloud Netflix之Eureka的使用
    SpringCloud学习笔记(1)----认识微服务与SpringCloud
    SpringBoot学习笔记(16)----SpringBoot整合Swagger2
    SpringBoot学习笔记(15)----SpringBoot使用Druid
    SpringBoot学习笔记(14)----应用监控-HTTP方式
    SpringBoot学习笔记(13)----使用Spring Session+redis实现一个简单的集群
    SpringBoot学习笔记(12)----SpringBoot实现多个 账号轮询发送邮件
    SpringBoot学习笔记(11)-----SpringBoot中使用rabbitmq,activemq消息队列和rest服务的调用
    SpringBoot学习笔记(8)-----SpringBoot文件上传
  • 原文地址:https://www.cnblogs.com/wolf-sun/p/3253179.html
Copyright © 2020-2023  润新知