【转载】 vs2005视频教程 之 抽象类和接口 四 [视频]

原帖地址:http://www.cnblogs.com/thcjp/archive/2007/04/20/721587.html 

首先要感谢 anytao.cnblogs.com ,因为下面总结这部分我是直接粘贴复制他的,呵呵!

3.1 相同点

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

3.2 不同点

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

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

3.3 规则与场合

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 修饰符。

5. 他山之石

正所谓真理是大家看出来的,所以将原子里有创新性的观点潜列于此,一是感谢大家的共享,二是完善一家之言的不足,希望能够将领域形成知识,受用于我,受用于众。

  • dunai认为:抽象类是提取具体类的公因式,而接口是为了将一些不相关的类“杂凑”成一个共同的群体。至于他们在各个语言中的句法,语言细节并不是我关心的重点。
  • 桦山涧的收藏也很不错。
  • Artech认为:所代码共用和可扩展性考虑,尽量使用Abstract Class。当然接口在其他方面的优势,我认为也不可忽视。
  • shenfx认为:当在差异较大的对象间寻求功能上的共性时,使用接口;当在共性较多的对象间寻求功能上的差异时,使用抽象基类。

          最后,MSDN的建议是:

  • 如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单易行的方法来控制组件版本。通过更新基类,所有继承类都随更改自动更新。另一方面,接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口。
  • 如果创建的功能将在大范围的全异对象间使用,则使用接口。抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。
  • 如果要设计小而简练的功能块,则使用接口。如果要设计大的功能单元,则使用抽象类。
  • 如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。抽象类允许部分实现类,而接口不包含任何成员的实现。 

======================================================================================================

 

另外我们再看下  Dflying Chen  和 一醉解千愁  他们两的见解

Dflying Chen :接口用来定义两个对象通信的契约;抽象类用来封装对象间公用的行为。二者在设计起初的目标完全不同,可惜在实际应用中被太多的人误解。

一醉解千愁:接口 -- 粗略的技术规范, 抽象类 -- 对粗略的技术规范作了一些简单的说明 ,类 -- 技术规范的具体实现

实在说到最后了,我受不了啦,我就再补充一句吧,也许通过这句能够让大家来个蓦然回首

在我们大型的项目中,一般项目经理会按照功能分块,那么每个块最终必然是有联系的,他们靠什么联系呢?当然就是公开的接口了.至于接口下面是怎么实现的,大家没有必要知道太多,只要知道他们组这个接口实现了什么功能既可.这个时候,各版块之间的升级也就显得简单了,只要接口不动,内部的代码随便怎么修改都显得不那么重要了. 另外就是代码的复用程度更加高和更简单了.

BUT ,这也同时说明了接口的设计相对来说是很重要的了,现在您也明白了我为什么用掉差不多100分钟来说接口的东西了吧!(实际上加起来超过200分钟了)

 

======================================================================================================

看见没有,这就是大家知识共享的巨大力量了,我们上面看到这些东西不是我们任何一个人短时间能够总结出来的,但是大家一起总结,那结果就是这样爽的。

 

本来我想这部分我自己总结的,但是前面几节基本上把我的水分都压干了,而且想再从前面三节课中提炼我感觉很麻烦,所以本着拿来主义的宗旨,我就直接照着好的搬了。如果您对他们个中的含义不太理解的话请去看 抽象类和接口的前三级,那里我可是口水都说干了,应该算是很详细了,如果要想知道你的总结是否合理呢,就对照本章了,保管你 高高兴兴看视频,平平安安拿工资(难道拿工资会被老板扁一顿?)

我又要开始传道了:我希望大家都能够大方一点,别做得那么小气,生怕自己知道那点知识被别人知道了,饭碗就被别人抢了,事实上你在跟人分享知识的过程中并不是只一味的在付出,你同样也会有收获,无论是帮别人解答疑问还是跟别人交流。就好象我现在做这个视频一样,看起来我是在无偿的为大家做,事实上呢我同样是有收获的,因为做这个视频的时候我发现了很多我过去学和用中一直没有注意到的死角,也发现很多更新,更好的技巧,更不说我这期间从一个默默无闻的菜鸟到有这么多朋友希望通过买我的书来支持我。

所以我相信,只要我们每个人都尽量的多跟人分享你的所学,那么中国的计算机技术超越美日是绝对不会太遥远的,但是如果我们大家都一味的做出一副不得了的架势,那么不说中国的计算机技术没希望,我说你TMD自己也不会有什么成就的。(希望早点超越美日,我们的目标就可以是超越宇宙中某个比我们更高级的星球了,哈哈),我喜欢老赵的那句话,让外国人看中国人的技术文章,说到老赵,我觉得在博客园里Dflying Chen 和老赵这两匹黑马(因为他们的排名跑得太快了)所做的贡献是大家都看见的,如果对他们了解一点点的朋友也会发现他们无论技术还是生活质量那提高的速度也是很快的啊。还有李会军老师,就是搞《新版设计模式》的哪个牛X人,人家不是把本来可以出版卖钱的书做成电子书给大家下载,多好的一位同志啊。当然,还有好多好多,比如上面为我们总结这么多的anytao,因为我跟他们不认识,更恰当的说是他们不认识我,哈哈。

所以啊,我还是那句老话,为中国雄起而努力

废话完毕,开始做实例

视频和代码下载地址

时间: 2024-09-29 09:47:33

【转载】 vs2005视频教程 之 抽象类和接口 四 [视频]的相关文章

C#中抽象类和接口的区别

一.抽象类: 抽象类是特殊的类,只是不能被实例化:除此以外,具有类的其他特性:重要的是抽象类可以包括抽象方法,这是普通类所不能的.抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们.另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们. 二.接口: 接口是引用类型的,类似于类,和抽象类的相似之处有三点: 1.不能实例化: 2.包含未实现的方法声明: 3.派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括

class-如何简洁明了的描述Android中活动、实例、对象、类、抽象类、接口之间的关系?

问题描述 如何简洁明了的描述Android中活动.实例.对象.类.抽象类.接口之间的关系? 如何简洁明了的描述Android中活动.实例.对象.类.抽象类.接口之间的关系? 解决方案 实例.对象.类.抽象类.接口是java的语法,和android没有关系. 抽象类是不可以实例化并且包含抽象成员的类,一种特殊的类. 类的实例叫做对象 接口约定了一个类必须实现哪些方法 android的活动(activity)是一个应用程序组件,提供一个屏幕,用户可以用来交互为了完成某项任务 解决方案二: 抽象类和接

无法创建抽象类或接口“System.Windows.Forms.DataGridViewCell”的实例?

问题描述 introw=dataGridView1.CurrentCell.RowIndex;dataGridView1.CurrentCell=newDataGridViewCell(row+1,0);if(this.ds.HasChanges){}无法创建抽象类或接口"System.Windows.Forms.DataGridViewCell"的实例无法将方法组"HasChanges"转换为非委托类型"bool".您是要调用方法吗?这两个问题

用最简单的话概括 抽象类 和接口的区别?

问题描述 在网上看了些关于这方面的资料,感觉自己的理解还是不透确.我是这样理解的,从设计层次考虑:如果基类的方法在子类中都需要,则用抽象类定义.如果某些方法在某些子类中不需要,则这些方法应该定义在接口中.比如abstractclassdoor{close();open()}而Alarmdoor需要报警行为,但是可能其他门并不需要这个行为,所以可以将报警方法定义在一个接口中.interfaceArmdoor{alarm();}classAlarmdoor()extendsdoorimplentsA

抽象类和接口联系与区别

关键字: 抽象类与接口的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java强大的面向对象能力. abstract class和interface之间在对于抽象类定义的支持方面具有很大的相似性,甚至可以相互替换,因此很多开发者在进行抽象类定义时对于 abstract class和interface的选择显得比较随意. 其实,两者之间还是有很大的区别的,对于它们的选择甚至反映出对于问题领域本质的理解.对于

java 抽象类与接口的定义

java  抽象类与接口的定义 Jvm : 抽象规范: 一个具体实现 一个运行的虚拟机实例 装载器: 启动类装载器,自定义装载器(继承 java.lang.ClassLoader ) 解析的内型信息放入方法区,对象放入堆,一个新线程,有自己 java 栈放中间数据, pc 计数器. 接口与抽象类深入 java 没有多重继承,意味一个类只能继承一个父类所以绝对必要的时候,才用继承 所以表示相同行为的方法都应该声明为一个接口的的形式,并使用不同的实现类对其进行实现. 缺点:每一个实现类都需要显示的实

C#之美—抽象类与接口孽缘

在很久很久以前我们的祖先将我们大自然所有能动的物体都定义成"动物".但是后来在动物的群体当中,有一类动物进化的非常快,它们的智商明显高出其他动物,它们就是"人类",这也许就是人类文明的起源. 所谓的"人类"开始给动物定义级别了,他们认为"人类"是最聪明的,从而将自己和普通的动物划分界限并且人类是主导"动物"世界的头领.[王清培版权所有,转载请给出署名] 可是大自然总是充满杀戮,大鱼吃小鱼,小鱼吃虾米.这个时

程序猿的日常——Java基础之抽象类与接口、枚举、泛型

再次回顾这些基础内容,发现自己理解的又多了一点.对于一些之前很模糊的概念,渐渐的清晰起来. 抽象类与接口 抽象类通常是描述一些对象的通用方法和属性,并且默认实现一些功能,它不能被实例化.接口仅仅是描述一种方法的规约,即只能通过某几个方法来操作对象,它把内部的实现隐藏到实现类中,自己仅仅关注使用而已. 参数 抽象类 接口 默认的方法实现 它可以有默认的方法实现 接口完全是抽象的.它根本不存在方法的实现 实现 子类使用extends关键字来继承抽象类.如果子类不是抽象类的话,它需要提供抽象类中所有声

php中抽象类和接口的概念以及区别

本篇文章是对php中抽象类和接口的概念以及区别进行了详细的分析介绍,需要的朋友参考下   复制代码 代码如下: //抽象类的定义: abstract class ku{ //定义一个抽象类 abstract function kx(); ...... } function aa extends ku{ //实现抽象类的方法 function kx(){ echo 'sdsf'; } } //使用方法 $aa=new aa; $aa->kx(); //1.定义一些方法,子类必须完全实现这个抽象中所