zoukankan      html  css  js  c++  java
  • C#基础系列-抽象类与接口

    一、前言

    在对业务对象抽象成类,定义类的属性、方法、事件等和组织类之间关系的时候会使用到抽象类和接口,两者都具备可以继承的特性,所以就会提出什么时候使用接口?什么时候使用抽象类?使用的原则是什么?等问题,怎么通过合理使用抽象类和接口能够更好表达业务关系,提高代码的扩展性。

    二、抽象类

    抽象类不与具体的事物相联系,而只是表达一种抽象的概念,仅仅作为其派生类的基类

    其主要特征:抽象方法只作声明,而不包含实现,可以看成是没有实现体的虚方法;抽象类不能被实例化;抽象类可以但不是必须有抽象属性和抽象方法,但是一旦有了抽象方法,就一定要把这个类声明为抽象类;具体派生类必须覆盖基类的抽象方法;抽象派生类可以覆盖基类的抽象方法,也可以不覆盖。如果不覆盖,则其具体派生类必须覆盖它们;抽象类不能被密封(sealed);具体派生类只能继承一个抽象类(类的单继承)。

    三、接口

    接口定义了所有类继承接口时应遵循的语法合同与契约

    其主要特征:接口不能被实例化;接口只能包含方法声明;接口的成员包括方法、属性、索引器、事件;接口中不能包含常量、字段(域)、构造函数、析构函数、静态成员。

    四、抽象类与接口的区别

    相同点:都可以被继承;都不能被实例化;都可以包含方法声明;派生类必须实现未实现的方法。

    不同点:面向对象中类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象类就是对类的抽象。接口只是定义一个行为的规范或者规定。在.NET类库中接口名称一般able结尾,表明其描述的是可以实现什么功能。抽象类体现的是一系列类间紧密关系,而接口大多数关系疏松,定义在类中都要实现的具体功能;一个类一次可以实现若干个接口,但是只能扩展一个父类;接口基本不具备继承的任何具体特点,它仅仅定义可以使用的方法,没有具体实现;抽象类实现OOP中的一个原则,把可变与不可变的分离,抽象类和接口就是定义为不可变的,而把可变的让子类去实现。

    五、使用原则

    使用抽象类和接口就要理解其表达的特性,抽象类是对根源的抽象,主要表达了这个对象是什么;接口是对动作的抽象,主要表达了对象能做什么。

    1、抽象类设计注重对象性,描述对象本质,共同性。

    2、接口设计注重服务,比如.NET类库的IDisposable,IEnumerable,IComparable ,ICompare,可枚举,可比较,资源释放等功能以接口的形式提供,在类中继承接口实现方法就可以获得相应的功能,服务型的体现。

    2、子类间有关系的考虑使用抽象类,没有关系的使用接口。

    3、版本迭代优先考虑抽象而不是接口,因为接口一旦定义对外发布,对接口进行变动会破坏已经实现该接口的类,而抽象类具有灵活性,只要添加的方法不是抽象方法。

    4、在实践中如果使用抽象类来定义行为,往往导致过于复杂的继承关系,而通过接口定义行为可以有效的分离行为和实现,为代码的维护和修改带来便利。

    六、总结

    1、接口是个性大于共性;差异较大的个性间具有某些相同的行为;相同行为的实现方式有较大区别;在差异较大的对象间寻求功能上的共性。

    2、抽象类是共性大于个性;共性相同的个体间必然具有相同的属性与行为;相同行为的实现方式具有一定区别;在共性较多的对象间寻求功能上的差异。

    3、抽象类在类设计中要使用好抽象类站在类的角度抽象,描述了这一类事物的本质,继承抽象类既是业务层面关系体现,也是代码层面共用的要求。

    4、接口在业务层面提供具有“一致性”功能(多态性),但不像抽象类功能描述了本质;代码层面则是定义契约,规定类要实现的功能,约束性,明确了方法。

    ps:面向接口编程是面向对象思想的一个重要的原则。

     

  • 相关阅读:
    centos 7 安装zabbix 4.0
    django Middleware
    初探paramiko
    python中的反射
    python异常处理
    双绞线
    简易的CMDB服务端
    4-初识Django Admin
    数据资产管理实践纲要
    matplotlib 散点图,为不同区域的点添加不同颜色
  • 原文地址:https://www.cnblogs.com/tuqunfu/p/14768677.html
Copyright © 2011-2022 走看看