GPS 平台, 网站建设, 软件开发, 系统运维, 找森大网络科技!
http://cnsendnet.taobao.com/
来自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=513
什么是接口?
接口是包含一组虚方法的抽象类型, 其中每一种方法都有其名称, 参数和返回值. 接口方法不能包含任何实现, CLR 允许接口可以包含事件, 属性, 索引器, 静态方法, 静态字段, 静态构造函数以及常数. 但是注意: C# 中不能包含任何静态成员. 一个类可以实现多个接口, 当一个类继承某个接口时, 它不仅要实现该接口定义的所有方法, 还要实现该接口从其他接口中继承的所有方法.
什么是抽象类?
抽象类提供多个派生类共享基类的公共定义, 它既可以提供抽象方法, 也可以提供非抽象方法. 抽象类不能实例化, 必须通过继承由派生类实现其抽象方法, 因此对抽象类不能使用 new 关键字, 也不能被密封. 如果派生类没有实现所有的抽象方法, 则该派生类也必须声明为抽象类. 另外, 实现抽象方法由 override 方法来实现.
相同点
都不能被直接实例化, 都可以通过继承实现其抽象方法.
都是面向抽象编程的技术基础, 实现了诸多的设计模式.
不同点
接口支持多继承; 抽象类不能实现多继承.
接口只能定义抽象规则; 抽象类既可以定义规则, 还可能提供已实现的成员.
接口是一组行为规范; 抽象类是一个不完全的类, 着重族的概念.
接口可以用于支持回调; 抽象类不能实现回调, 因为继承不支持.
接口只包含方法, 属性, 索引器, 事件的签名, 但不能定义字段和包含实现的方法; 抽象类可以定义字段, 属性, 包含有实现的方法.
接口可以作用于值类型和引用类型; 抽象类只能作用于引用类型. 例如, Struct 就可以继承接口, 而不能继承类.
MSDN 的建议是:
如果预计要创建组件的多个版本, 则创建抽象类. 抽象类提供简单易行的方法来控制组件版本. 通过更新基类, 所有继承类都随更改自动更新. 另一方面, 接口一旦创建就不能
更改. 如果需要接口的新版本, 必须创建一个全新的接口.
如果创建的功能将在大范围的全异对象间使用, 则使用接口. 抽象类应主要用于关系密切的对象, 而接口最适合为不相关的类提供通用功能.
如果要设计小而简练的功能块, 则使用接口. 如果要设计大的功能单元, 则使用抽象类.
如果要在组件的所有实现间提供通用的已实现功能, 则使用抽象类. 抽象类允许部分实现类, 而接口不包含任何成员的实现.
结论
接口和抽象类, 是论坛上, 课堂间讨论最多的话题之一, 之所以将这个老话题拿出来再议, 是因为从我的体会来说, 深刻的理解这两个面向对象的基本内容, 对于盘活面向对象
的抽象化编程思想至关重要. 本文基本概况了接口和抽象类的概念, 异同和使用规则, 从学习的观点来看, 我认为这些总结已经足以表达其核心. 但是, 对于面向对象和软件设
计的深入理解, 还是建立在不断实践的基础上, Scott 说自己每天坚持一个小时用来写 Demo, 那么我们是不是更应该勤于键盘呢. 对于接口和抽象类, 请多用而知其然, 多想而
知其奥吧.
什么是抽象方法, 什么是虚方法
如果一个基类方法要在派生类中被覆盖, 就必须把这个基类方法申明为 virtual
抽象方法和虚拟方法的区别在于:
虚拟方法有一个实现部分, 并为派生类提供了覆盖该方法的选项; 相反,
抽象方法没有提供实现部分, 强制派生类覆盖方法 (否则派生类不能成为具体类)
总结:
如果一个类全部由抽象方法组成, 那就是接口. 即接口中的方法都是抽象方法.
抽象类中的方法可以是抽象方法, 也可以是非抽象方法 (即普通方法).
- // 在抽象类和接口中, 抽象方法和接口方法都不能有方法体, 需要依靠继承基类的子类去实现
- // 抽象方法一定没有方法体, 而虚方法有方法体
- // 可以把抽象方法看作是没有方法体的虚方法
1. 在 c 语言中, 函数是采用早期绑定的, 即在程序运行之前, 编译器就要决定调用那个函数, 这个过程叫做静态联编.
2. 动态联编, 这项功能在 c++ 中默认是关闭的. 开启某个函数的晚期绑定的方式是在此函数的类型前加入 virtual 关键字, 这种采用晚期绑定的函数就称为虚函数.
引自 msdn:
若一个实例方法的声明中含有 virtual 修饰符, 则称该方法为虚拟方法; 一个虚拟方法的实现可以由派生类取代. 取代所继承的虚拟方法的实现的过程称为重写该方法; 在一个虚拟方法调用中, 该调用所涉及的那个实例的运行时类型确定了要被调用的究竟是该方法的哪一个实现.
虚函数的限制:
1. 虚函数仅适用于有继承关系的类对象, 所以只有类的成员函数才能说明为虚函数.
2. 静态成员函数不能是虚函数.
3. 内联函数不能是虚函数.
4. 构造函数不能是虚函数.
5. 析构函数可以是虚函数.
接口可以有静态成员, 嵌套类型, 抽象, 虚拟成员, 属性和事件. 实现接口的任何类都必须提供接口中所声明的抽象成员的定义. 接口可以要求任何实现类必须实现一个或多个其他接口.
对接口有以下限制:
接口可以用任何可访问性来声明, 但接口成员必须全都具有公共可访问性.
不能向成员或接口自身附加安全性权限.
接口可以定义类构造函数, 但不能定义实例构造函数.
每种语言都必须为需要成员的接口映射一个实现提供规则, 因为不只一个接口可以用相同的签名声明成员, 且这些成员可以有单独的实现.
接口可以由类和结构来实现. 为了指示类或结构实现了某接口, 在该类或结构的基类列表中应该包含该接口的标识符. 如果一个类或结构实现某接口, 则它还隐式实现该接口的所有基接口. 即使在类或结构的基类列表中没有显式列出所有基接口, 也是这样.
GPS 平台, 网站建设, 软件开发, 系统运维, 找森大网络科技!
http://cnsendnet.taobao.com/
来自森大科技官方博客
http://www.cnsendblog.com/index.php/?p=513
来源: http://www.bubuko.com/infodetail-3501823.html