§ ITPOW >> 文档 >> C#

C# 抽象类与接口的应用场景与应用方式区别

作者:vkvi 来源:ITPOW(原创) 日期:2012-4-3

网上也有关于抽象类和接口的区别,但更多的是侧重于应用方式,没有从应用场景上深挖,比如什么情况下用抽象类,什么情况下用接口,本文从应用场景和应用方式上介绍区别。

应用场景

接口的目的是提供一个标准让大家来遵守,可以是不同类别的类都来遵守,比如礼花和航天飞机都遵守一个“发射接口”;

而抽象的目的是我无法实现它,由继承我的类来实现,比如说触摸屏抽象类的触摸方法:有的触摸屏是电容屏,得用手指去写;有的触摸屏是电容屏,得用笔或指甲盖去划。

再举个例子,以手机为例,假如用抽象类,得这样设计:

这种设计就存在一个问题,这就要求每一个手机必须拥有如上的功能,这显然是不现实的,我这个手机无法照相,那这个类就跑不起来了。如果改成接口:

应用方式

抽象类

  • 不能对字段抽象(因为字段只能用等号赋值,没其他代码(不同于属性),没啥抽象的意义);
  • 不能对 private 抽象;
  • 可以含有非抽象的成员;
  • 不能实例化;
  • 只能从一个类继承;
  • 可以被抽象类继承,此时不必实现抽象成员;
  • 可以被普通类继承,此时必须实现抽象成员(网上有些说的不必实现,其实那有错误,普通类继承自抽象类时,必须实现抽象类的全部抽象成员);
  • 实现抽象成员时要加 override

接口

  • 不能对字段接口(因为字段只能用等号赋值,没其他代码(不同于属性),没啥接口的意义);
  • 接口只能是 public 的,且不能使用 public 关键字;
  • 除了接口成员,不能有其他任何实现代码;
  • 不能实例化;
  • 可以从多个接口继承;
  • 可以被接口继承;此时不必也无法实现接口成员;
  • 可以被抽象类继承,此时必须实现接口成员;
  • 可以被普通类继承,此时必须实现接口成员;
  • 实现接口不能加 override,必须加 public。
相关文章