相同点

●都不能被直接实例化,都可以通过继承实现其抽象方法。 
●都是面向抽象编程的技术基础,实现了诸多的设计模式。

不同点

●接口支持多继承;抽象类不能实现多继承。 
●接口只能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员。 
●接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。 
●接口可以用于支持回调;抽象类不能实现回调,因为继承不支持。 
●接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、包含有实现的方法。 
●接口可以作用于值类型和引用类型;抽象类只能作用于引用类型。例如,Struct就可以继承接口,而不能继承类。

通过相同与不同的比较,我们只能说接口和抽象类,各有所长,但无优略。在实际的编程实践中,我们要视具体情况来酌情量才,但是以下的经验和积累,或许能给大家一些启示,除了我的一些积累之外,很多都来源于经典,我相信经得起考验。所以在规则与场合中,我们学习这些经典,最重要的是学以致用,当然我将以一家之言博大家之笑,看官请继续。

规则与场合

1.请记住,面向对象思想的一个最重要的原则就是:面向接口编程。 
2.借助接口和抽象类,23个设计模式中的很多思想被巧妙的实现了,我认为其精髓简单说来就是:面向抽象编程。 
3.抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。 
4.接口着重于CAN-DO关系类型,而抽象类则偏重于IS-A式的关系; 
5.接口多定义对象的行为;抽象类多定义对象的属性; 
6.接口定义可以使用public、protected、internal 和private修饰符,但是几乎所有的接口都定义为public,原因就不必多说了。 
7.“接口不变”,是应该考虑的重要因素。所以,在由接口增加扩展时,应该增加新的接口,而不能更改现有接口。 
8.尽量将接口设计成功能单一的功能块,以.NET Framework为例,IDisposable、IDisposable、IComparable、IEquatable、IEnumerable等都只包含一个公共方法。 
9.接口名称前面的大写字母“I”是一个约定,正如字段名以下划线开头一样,请坚持这些原则。 
10.在接口中,所有的方法都默认为public。 
11.如果预计会出现版本问题,可以创建“抽象类”。例如,创建了狗(Dog)、鸡(Chicken)和鸭(Duck),那么应该考虑抽象出动物(Animal)来应对以后可能出现风马牛的事情。而向接口中添加新成员则会强制要求修改所有派生类,并重新编译,所以版本式的问题最好以抽象类来实现。

12.从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。 
13.对抽象类不能使用new关键字,也不能被密封,原因是抽象类不能被实例化。 
14.在抽象方法声明中不能使用 static 或 virtual 修饰符。

以上的规则,我就厚颜无耻的暂定为T14条吧,写的这么累,就当一时的奖赏吧。大家也可以互通有无,我将及时修订。

参考资料:http://www.68design.net/Development/Aspnet/Basis-AspNet/28748-2.html

最新文章

  1. 5、ASP.NET MVC入门到精通——NHibernate代码映射
  2. Makefile中静态库,动态库的创建和使用以及解压缩命令
  3. 单例模式ARC和非ARC
  4. 如何修改myeclipse 内存?eclipse.ini中各个参数的作用。
  5. 【JUnit】EasyMock用法总结
  6. Python中docstring文档的写法
  7. disque概要
  8. OWIN katana注册中间件的几种写法
  9. C# 内存管理优化畅想(三)---- 其他方法&结语
  10. elasticsearch常用的插件
  11. 复制文件时,如何显示进度条(使用TFileStream一点一点读,或者使用BlockRead)
  12. 【Chromium中文文档】Chromium多进程架构
  13. Opencv基础知识-----视频的读取和操作
  14. 使用angular4和asp.net core 2 web api做个练习项目(二), 这部分都是angular
  15. 使用RestTemplate访问restful服务时遇到的问题
  16. Java提取URL某个参数的值
  17. 【design patterns】设计模式
  18. JUC虚假唤醒(六)
  19. 『TensorFlow』第十弹_队列&多线程_道路多坎坷
  20. Oracle 一些注意点

热门文章

  1. cvc-complex-type.2.4.a: Invalid content was found starting with element 'async-supported'
  2. POJ1325(最小顶点覆盖)
  3. Spring 循环依赖
  4. Vue.js:自定义指令
  5. thinkphp中配置信息的二维数组设置与使用
  6. java 高并发解决方案
  7. 当我们谈 SQL 优化时在谈些什么?
  8. Java微信公众平台开发(二)--微信服务器post消息体的接收
  9. PHP 环境安装
  10. 【原】Coursera—Andrew Ng机器学习—课程笔记 Lecture 1_Introduction and Basic Concepts 介绍和基本概念