当前位置:编程学习 > C#/ASP.NET >>

抽像类和接口的区别

抽像类和接口的区别 --------------------编程问答-------------------- Google --------------------编程问答--------------------
引用 1 楼 neohope 的回复:
Google

大家以后不要CSDN了???太敷衍了!!!

看我的:
http://www.baidu.com/s?tn=youcome_dg&ie=UTF-8&wd=%E6%8A%BD%E5%83%8F%E7%B1%BB%E5%92%8C%E6%8E%A5%E5%8F%A3%E7%9A%84%E5%8C%BA%E5%88%AB&cl=3

--------------------编程问答-------------------- --------------------编程问答-------------------- 一个用在类上,一个用在行为上,当然不同了,金蝶面试题有这个哈 --------------------编程问答-------------------- 接口
1,可多继承
2,只能有定义不能有实现
抽象类
1,不可多继承
2,可有定义,可有实现

------------
结论 抽象类=(接口+类)- 接口之继承

备注: 多继承还是非常重要的一个地方,很多现成的类,如果你想 扩展 那么通常只能用接口而不能用
抽象类或普通类,因为这些类都有其它的显示基类 比如 Form1:Form等等。

因此接口是比较轻量级的设计 ,而抽象类是比较重量级的实现 方式。 --------------------编程问答-------------------- 赶紧开始去学软件工程专业知识,而不仅仅是几个名词概念。 --------------------编程问答-------------------- 简单来说,
接口是公开的,里面不能有私有的方法或变量,是用于让别人使用的,而抽象类是可以有私有方法或私有变量的,

另外,实现接口的一定要实现接口里定义的所有方法,而实现抽象类可以有选择地重写需要用到的方法,一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。

还有,接口可以实现多重继承,而一个类只能继承一个超类,但可以通过继承多个接口实现多重继承,接口还有标识(里面没有任何方法,如Remote接口)和数据共享(里面的变量全是常量)的作用.

1.abstract class 在 Java 语言中表示的是一种继承关系,一个类只能使用一次继承关系。但是,一个类却可以实现多个interface.

  2.在abstract class 中可以有自己的数据成员,也可以有非abstarct的成员方法,而在interface中,只能够有静态的不能被修改的数据成员(也就是必须是 static final的,不过在 interface中一般不定义数据成员),所有的成员方法都是abstract的。

  3.abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。

  4.实现抽象类和接口的类必须实现其中的所有方法。抽象类中可以有非抽象方法。接口中则不能有实现方法。

  5.接口中定义的变量默认是public static final 型,且必须给其初值,所以实现类中不能重新定义,也不能改变其值。

  6.抽象类中的变量默认是 friendly 型,其值可以在子类中重新定义,也可以重新赋值。

  7.接口中的方法默认都是 public,abstract 类型的。

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

           抽象方法是必须实现的方法。就象动物都要呼吸。但是鱼用鳃呼吸,猪用肺呼吸。动物类要有呼吸方法。怎么呼吸就是子类的事了。
       现在有很多讨论和建议提倡用interface代替abstract类,两者从理论上可以做一般性的混用,但是在实际应用中,他们还是有一定区别的。抽象类一般作为公共的父类为子类的扩展提供基础,这里的扩展包括了属性上和行为上的。而接口一般来说不考虑属性,只考虑方法,使得子类可以自由的填补或者扩展接口所定义的方法,就像Java王子所说的事件中的适配器就是一个很好的应用。
  用一个简单的例子,比如说一个教师,我们把它作为一个抽象类,有自己的属性,比如说年龄,教育程度,教师编号等等,而教师也是分很多种类的,我们就可以继续教师类而扩展特有的种类属性,而普遍属性已经直接继续了下来。
  而接口呢~还是拿教师做例子,教师的行为很多,除了和普通人相同的以外,还有职业相关的行为,比如改考卷,讲课等等,我们把这些行为定义成无body 的方法,作为一个集合,它是一个interface。而教师张三李四的各自行为特点又有不同,那么他们就可以扩展自己的行为body。从这点意义上来说,interface偏重于行为。
  总之,在许多情况下,接口确实可以代替抽象类,假如你不需要刻意表达属性上的继续的话。  --------------------编程问答-------------------- 五楼说的很好,两者都是封装所付出的代价,但是并不影响开发速度~ --------------------编程问答-------------------- 现在面对大量冗余的信息,不能直接筛选出简单有用的信息才会问这样的问题,特别是这样概念性的东西,巧妙的记忆也是很关键的。
我之前也是死活记不住这应用,但是网络上的一个信息很关键:
abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。

abstract有一种反应本质的含义,比如猫是动物,狗也是动物,所以可以写一个抽象类:动物,然后猫和狗都继承动物抽象类。

interface有一种行为含义,更加具体的意义,比如定义一个接口:行为,行为中有很多方法:玩耍,吃饭,睡觉,然后猫和狗实现行为接口,他们就都要实现具体的方法:如何玩耍,如何吃饭,如何睡觉。

在设计上有这样的一个概念:一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。 

上面的例子设计思路就是:首先定义行为的接口,然后定义抽象类动物实现行为接口,然后再到具体的类实现动物抽象类。

记忆的方式每个人都不一样,选择合适自己的方法来记忆很关键。
--------------------编程问答-------------------- 类是对象的抽象。
抽象类是对类的抽象
接口是对行为的抽象。 --------------------编程问答-------------------- sp老师说的对
引用 6 楼 sp1234 的回复:
赶紧开始去学软件工程专业知识,而不仅仅是几个名词概念。
--------------------编程问答-------------------- 抽象类和接口有很多相似之处:

接口表示调用者和设计者的一种约定,在多人合作开发同一个项目时,事先定义好相互调用的接口可以大大提高开发的效率。接口是用类来实现的,实现接口的类必须严格按照接口的声明来实现接口提供的所有功能。有了接口,就可以在不影响现有接口声明的情况下,修改接口的内部实现,从而使兼容性问题最小化。

当其他设计者调用了接口后,就不能再随意更改接口的定义,否则项目开发者事先的约定就失去了意义。但是可以在类中修改相应的代码,完成需要改动的内容。

抽象类是指这个类是不完全可用的,只能作为其它类的基类。抽象类和其它非抽象类的最大区别之处在于:抽象类不能被实例化。

1) 抽象类和接口都不能被实例化

2)接口是完全抽象的成员集合;抽象类可以完全实现,也可以部分实现或者根本不实现,从而封装继承类的通用功能

3) 抽象类只能作为基类使用,接口可以从其它基接口继承

4)接口成员默认访问方式是public,接口成员定义不能包含任何访问修饰符;抽象类则不然

5) 接口中不能声明任何种类的静态成员,抽象类则可以

6) 接口成员必须只能是方法、属性、索引器和事件,且不提供实现;抽象类还可以声明字段以及实现的方法和属性等

7) 抽象方法只能在抽象类中声明

使用接口或抽象类为组件提供多态性主要考虑以下几个方面:

1.        如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单易行的方法来控制组件版本。通过更新基类,使所有继承类都自动更新。另一方面,为了保护为使用接口而编写的现有系统,要求接口一旦创建就不能更改。如果需要接口的新版本,必须创建一个全新的接口。

2.        如果创建的功能将在大范围的完全不同的对象间使用,则使用接口。抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。

3.        如果要设计小而简炼的功能块,则使用接口;如果设计大的功能单元,则使用抽象类。设计优良的接口往往很小且相互独立,减少发生性能问题的可能。

4.        如果要在组件的所有实现间传递通用的已实现功能,则使用抽象类。抽象类允许部分实现类,而接口不包含任何成员的实现。 --------------------编程问答-------------------- 概括起来讲:
横看接口竖看类:横向扩展用接口;纵向扩展用抽象基类;横向和纵向都扩展,用抽象基类继承接口。
差异较大的对象中追求功能上的相同时,使用接口;
差异较小的对象中追求功能上的不同时,使用抽象接类。 --------------------编程问答--------------------
引用 9 楼 much0726 的回复:
现在面对大量冗余的信息,不能直接筛选出简单有用的信息才会问这样的问题,特别是这样概念性的东西,巧妙的记忆也是很关键的。
我之前也是死活记不住这应用,但是网络上的一个信息很关键:
abstract class和interface所反映出的设计理念不同。其实abstract class表示的是"is-a"关系,interface表示的是"like-a"关系。

abstract有一种反应本质的含义,比如猫是动物,狗也是动物,所以可以写一个抽象类:动物,然后猫和狗都继承动物抽象类。

interface有一种行为含义,更加具体的意义,比如定义一个接口:行为,行为中有很多方法:玩耍,吃饭,睡觉,然后猫和狗实现行为接口,他们就都要实现具体的方法:如何玩耍,如何吃饭,如何睡觉。

在设计上有这样的一个概念:一般的应用里,最顶级的是接口,然后是抽象类实现接口,最后才到具体类实现。

上面的例子设计思路就是:首先定义行为的接口,然后定义抽象类动物实现行为接口,然后再到具体的类实现动物抽象类。

记忆的方式每个人都不一样,选择合适自己的方法来记忆很关键。


没有什么like-a。

interface和class在设计上都是一样的,都是is-a。如果你把本不应该看作is-a的东西用类型的接口约束来表达(而不是仅仅表达为类型中的一个属性),肯定概念上也是乱的。 --------------------编程问答-------------------- 在抽象的彻底上,接口要超过抽象类,接口全是抽象,抽象类可以有具体的字段方法等
接口是对事物行为方法的抽象,抽象类是对事物特征及其行为方法的抽象
接口作为抽象的最顶层,可以被抽象类继承
一个类能实现多个接口,但只能继承于一个类 --------------------编程问答-------------------- 可能因为这两个东西在编译器上定义不同,所以容易刻意去过多考虑其“区别”。

在面向对象设计时,至少在系统概要设计时,根本不需要考虑去区分class还是interface。当你去区分该使用class或者interface的时候,已经过分具体了。

如果你一定要在设计时(而不是编码时)class和intrface中选一个,那么无奈地,只能选择interface进行设计。这是因为.net的class不支持多重继承,只能用interface来表达。也就是说,你在设计时可以只用接口来表达对象类之间的继承概念,然后在编码时才考虑使用class还是interface来标识设计时的接口概念。实际上设计时的接口也就是类型,是同一个东西。 --------------------编程问答-------------------- 例如你可以在设计时用“类型关联图”画出一个关于“电动自行车”的类,它继承了“自行车”类,也继承了“电动机械”类,还继承了“环保”类,这就是设计。

此时去用编程的“class还是interface”来刻意区别,对设计没有什么意义。 --------------------编程问答-------------------- 在理解“区别”的时候,就可以看出你是“先设计后编程”还是“先编程后设计”。class与interface的差别是.net的具体差别,不同的编程语言有不同的实现面向对象设计的机制,有许多更优秀的并且历史更悠久以至于c++、java和.net都是在模仿人家的语言,设置根本没有interface而只有class概念。

把设计和编程区分开,然后再理解class和ineterface的区别。如果你在理解class和interface的区别时也过多纠缠进了设计问题,就会影响你的面向对象设计技术的简洁实用性。 --------------------编程问答-------------------- http://topic.csdn.net/u/20091105/11/206b6304-e8e1-43ae-b305-f316e7ed75b0.html --------------------编程问答-------------------- 我觉得,如果从技术角度讲,抽象类和接口可以混起来使用的,你把抽象类里面的所有东西都定义成public abstract,不就是个接口?当然,C#支持多接口实现,但不支持多类继承。在c++这样的支持多继承的语言中,抽象类可以与接口等同。
但是,如果从面向对象的角度去看,抽象类和接口就不一样。接口描述的是“aaa具有bbb这种能力”的概念。就比如电子报警门,它首先是一扇门(抽象类),而且具有报警的能力(接口),于是就会是:

public AlertDoor : Door, IAlertable


请参见我的这篇文章:http://www.sunnychen.org/article.asp?id=32 --------------------编程问答-------------------- 有道理,我顶 --------------------编程问答-------------------- 月经贴。。。 --------------------编程问答-------------------- 说“手机具有充电能力”跟说“手机是一个具有充电能力的东西”有区别吗?

过分强调这个区别,在设计时就是冗余了。 --------------------编程问答-------------------- 过分强调这种区别,正好是因为不少人是先编程,然后才去附会设计问题。如果你搞很多种面向对象设计编程语言,你就很容易跳出某种编程语言对你的思想毒害,去抽象出更加高效而简洁的设计技术,设计时所用的概念只是指导而不基于于某一种编程语言。 --------------------编程问答--------------------
引用 4 楼 dbattn 的回复:
一个用在类上,一个用在行为上,当然不同了,金蝶面试题有这个哈


金蝶的面试题出的还真有特色! --------------------编程问答-------------------- 路过,先看看 --------------------编程问答-------------------- 关系密切的对象用抽象,不相关的类提供通用功能用接口 --------------------编程问答-------------------- 接口纯粹是为了多重继承而存在 --------------------编程问答-------------------- 在设计“电子报警门”时,它首先是具有报警能力的东西(因为我们独立设计了这个类),同时也还是门,这样定义又有什么不可以呢?

只是.net不支持直接了当地实现这种设计而已,于是我们才出现了class、interface、abstract之类的争论。但是这些都是编程,上的区别。如果我们使用根本没有interface的.net动态语言跟c#一起开发软件,难道就不能设计交流了吗?

我是希望先学面向对象设计,然后再具体讨论.net各种OOPL在实现编程时的具体语法规定。 --------------------编程问答-------------------- 其实编程时是很自由的!在c#编程时,我们可以把“报警装置”设计为类,这样就只好把单独搞个“门接口”了!也可以反过来!也可以全都是实现为接口。

在设计时,全都看作开放的类吧。设计时,你的任务是去定义其开放的属性定义、功能定义,测试其流程是否完备,判断类型设计用于继承和多态时否高效和严谨地扩展到大量具体类型。这时不必区分class和inteface。

当你编程的时候,脑子里至少会有着这张类型关联图,选择class或者intrface其实很自由。在vs的帮助下,你可以使用refactor功能“一瞬间”就从class中抽取出interface,vs给你自动产生代码。编程工具尚且如此自由,那么争论这里class还是interface的对错岂不是会引起很多编程者的派别冲突? --------------------编程问答-------------------- 面向对象设计主要是为了领域专家(不一定知道编程知识的人)之间沟通,因此我的出发点是看看你有没有因为学c#就妨害了你学面向对象设计知识,而我此时刻意并不去涉及c#编程知识问题。

我相信一旦熟练进行设计,编程时才需要考虑的东西就可以自己很快理解,即使别人的“范例”是把设计跟编程混起来你也能看懂,因为你会透过class、interface看出设计者本质头脑中的类型关联图像。

编程语言规定你如何使用class、interface、abstract这些靠读语言编程手册和小例子就可以学会,而工程设计的知识才需要专门作为一个学科学一下。 --------------------编程问答-------------------- 实际没区别,sp1234没错,楼上那几位也没错。

sp1234是基于“先验现象学”的,认为“所有的现象本身都是由其他现象所奠基的”,所以理论上只要拆分足够的原子现象,就能组合表达出所有的现象

而另一派的观念是“还原现象学”,是“还原现实世界在人脑中那个映射”,“现实世界通过人脑以后”除了原始的模型以外,会附加上很多 人脑所赋予的“特性规则”

就拿楼上两个例子:电动自行车 的原始模型无疑是 机械,但是人脑所赋予的特性规则是“电子化,环保”
电子报警门:的原始模型无疑是“门”,人脑附加的特性是“具有报警功能”

在我看来两派并没有区别,只要有足够多的原子就成,唯一的区别是 “还原派”附加了人的因素,就像还原现象学的鼻祖海德格尔的那个著名的“烦”,烦-----烦有现实的模型物理上的“抽象烦”(吃不饱,穿不暖),也就人脑中的“接口烦”(思不得,求不得)

--------------------编程问答--------------------
引用 29 楼 sp1234 的回复:
在设计“电子报警门”时,它首先是具有报警能力的东西(因为我们独立设计了这个类),同时也还是门,这样定义又有什么不可以呢?

只是.net不支持直接了当地实现这种设计而已,于是我们才出现了class、interface、abstract之类的争论。但是这些都是编程,上的区别。如果我们使用根本没有interface的.net动态语言跟c#一起开发软件,难道就不能设计交流了吗?

我是希望先学面向对象设计,然后再具体讨论.net各种OOPL在实现编程时的具体语法规定。


我只能这样说,你的思路是没有问题的,我也非常同意先学面向对象设计,然后才有不同语言的不同实现方式。楼主这个问题是从编程语言的技术角度去提的,也就是我在上面所说的,两者在技术角度没有什么明显区别。唯一需要注意的就是c#这种面向对象语言跟c++这种面向对象语言不一样,它不支持类的多重继承。

我们现在只是把问题提高到面向对象上,而不仅仅是技术上。那么既然是设计,各有各的做法,没有什么完全可以或者完全不可以。电子报警门,让他就继承于“门”,当然可以,让他继承于“门”,并实现“可报警”的接口,当然可以,你甚至可以什么都别去继承,直接定义一个“电子报警门”的类,这样我也不会有什么问题。

为什么我会这么说?因为你的设计不仅仅是面向对象上的东西,你需要考虑你究竟要去解决什么样的问题,这才是合理设计的参考标准。我认为,合理的设计应该是面向对象+需要解决的问题,而成功的项目则是需求+合理的设计。不知朋友您对我的这个看法有何高见,很希望您能够指点一二。呵呵,我们都扯远了。 --------------------编程问答--------------------
引用 32 楼 wanghui0380 的回复:
实际没区别,sp1234没错,楼上那几位也没错。

sp1234是基于“先验现象学”的,认为“所有的现象本身都是由其他现象所奠基的”,所以理论上只要拆分足够的原子现象,就能组合表达出所有的现象

而另一派的观念是“还原现象学”,是“还原现实世界在人脑中那个映射”,“现实世界通过人脑以后”除了原始的模型以外,会附加上很多 人脑所赋予的“特性规则”

就拿楼上两个例子:电动自行车 的原始模型无疑是 机械,但是人脑所赋予的特性规则是“电子化,环保”
电子报警门:的原始模型无疑是“门”,人脑附加的特性是“具有报警功能”

在我看来两派并没有区别,只要有足够多的原子就成,唯一的区别是 “还原派”附加了人的因素,就像还原现象学的鼻祖海德格尔的那个著名的“烦”,烦-----烦有现实的模型物理上的“抽象烦”(吃不饱,穿不暖),也就人脑中的“接口烦”(思不得,求不得)


我觉得,软件设计上的事情,每个人的意见都是不会有错的,因为大家都能够摆事实,说理由。我只能说设计是合理还是不合理的。合理或者不合理也是在一个界定的上下文中,脱离了这个环境,合理的设计就会变得不合理。
--------------------编程问答-------------------- 强烈关注 --------------------编程问答--------------------
引用 34 楼 acqy 的回复:
我觉得,软件设计上的事情,每个人的意见都是不会有错的,因为大家都能够摆事实,说理由。我只能说设计是合理还是不合理的。合理或者不合理也是在一个界定的上下文中,脱离了这个环境,合理的设计就会变得不合理。


对你说的一点没错,这也是“现象学”,当初分为两派的原因,并且后一派给前一派加上了“先验”俩个字,而强调的自己这派“还原”的意义。 
1 是原子是很难拆干净的
2 拆出来的是“先验的”,也就是目前他是合适的,可谁知道以后合适不

所以,后一派强调还原,不要求拆出所有的,只要求还原现有的,并把人脑中的概念独立出来(因为人脑的概念都是通用的概念) --------------------编程问答-------------------- 支持一把,哈哈 --------------------编程问答-------------------- 我们来看看 http://tech.163.com/06/0629/09/2KPA7DSP0009159T.html 这个文章就会发现,它纯粹是为了java而OO,用java概念来解释OO。

编程就是编程,用特定一种编程机制来解析有着将近30年历史的OO软件设计技术,反对倒是根本没有抛析出细节,也就不能面向编程的未来。

事事都有个目的性,目的性不同也许结果看似相似但是看得远一点就大相径庭了。也许5年前我说“月亮是白的”,但是5年之后我可以把话往回说:月亮其实没有颜色。 --------------------编程问答-------------------- 当然,我(至少)5年来在面向对象技术上的观点始终是这样的:

.  面向对象分析与设计技术根本不是编程技术,不但可以给编程者使用,更是给广大的非编程者使用的。只是教育、教材的问题而已。

.  优秀的面向对象编程语言其实有很多种,例如Effiel、Smalltalk等都是。

.  我最有成就感的面向对象编程是很早以前使用纯c来全面实现的OO程序。不是使用非OOPL让我知道OO的本质用法而不纠缠于语言。

.  我注重架构设计,希望编程越少越好。 --------------------编程问答-------------------- 不是使用非OOPL让我知道OO的本质用法  -->  使用非OOPL让我知道OO的本质用法


因此,这个帖子的题目其实我本来也只是想说#1楼的话(当然我没有说)。但是看到了后边的回复,并且也看到了实际搜索出来的都是写什么东西,所以才特意引起一种反思。

vs的重构非常灵活,因此你完全可以把你所有的class都再自动产生一个对应的interface。你可以像一个“猴子”一样在不同的概念中挑来跳去,但是如果你真的跳累了,就会想到结论了。 --------------------编程问答-------------------- 高手们争论起来了,来看看。。。 --------------------编程问答-------------------- 真热闹,只看不说话 --------------------编程问答--------------------  我就看看, 我不说话 --------------------编程问答-------------------- 实际看看“还原现象学”是怎么还原的就知道了,

还原现象学-------目的还原现实世界在人脑中的映射。
方法:
第一步:“还原悬置”,搁置 人脑中那些附加特性,只考虑真实物理世界的那个模型,并得到一个带括号抽象模型“{真实物理世界模型}”(括号本身代表人脑的那些附加特性)

第二步:参照 括号内部的模型,打开括号,考虑人脑所附加的特性。

比如:化学元素 氢
第一步   {化学元素}---{一价化学元素} //物理模型
第二步: 氢=一价化学元素+元素特性(人脑中附加概念,如可燃性、氧化还原性、酸碱性等)


当然这只是一种构建模型的方式,而在OO的世界中,不同是世界观,不同的看问题的角度得到的模型也不同。就像sp1234说的这个问题本身并不是一个代码或语法问题,而是一个如何OO的问题 --------------------编程问答-------------------- 一、抽象类:
      抽象类是特殊的类,只是不能被实例化;除此以外,具有类的其他特性;重要的是抽象类可以包括抽象方法,这是普通类所不能的。抽象方法只能声明于抽象类中,且不包含任何实现,派生类必须覆盖它们。另外,抽象类可以派生自一个抽象类,可以覆盖基类的抽象方法也可以不覆盖,如果不覆盖,则其派生类必须覆盖它们。


       二、接口:
      接口是引用类型的,类似于类,和抽象类的相似之处有三点:
       1、不能实例化;
       2、包含未实现的方法声明;
       3、派生类必须实现未实现的方法,抽象类是抽象方法,接口则是所有成员(不仅是方法包括其他成员);

       另外,接口有如下特性:
接口除了可以包含方法之外,还可以包含属性、索引器、事件,而且这些成员都被定义为公有的。除此之外,不能包含任何其他的成员,例如:常量、域、构造函数、析构函数、静态成员。一个类可以直接继承多个接口,但只能直接继承一个类(包括抽象类)。


      三、抽象类和接口的区别:
      1.类是对对象的抽象,可以把抽象类理解为把类当作对象,抽象成的类叫做抽象类.而接口只是一个行为的规范或规定,微软的自定义接口总是后带able字段,证明其是表述一类类“我能做。。。”.抽象类更多的是定义在一系列紧密相关的类间,而接口大多数是关系疏松但都实现某一功能的类中. 
      2.接口基本上不具备继承的任何具体特点,它仅仅承诺了能够调用的方法;     
      3.一个类一次可以实现若干个接口,但是只能扩展一个父类     
      4.接口可以用于支持回调,而继承并不具备这个特点.     
      5.抽象类不能被密封。   
      6.抽象类实现的具体方法默认为虚的,但实现接口的类中的接口方法却默认为非虚的,当然您也可以声明为虚的. 
      7.(接口)与非抽象类类似,抽象类也必须为在该类的基类列表中列出的接口的所有成员提供它自己的实现。但是,允许抽象类将接口方法映射到抽象方法上。   
      8.抽象类实现了oop中的一个原则,把可变的与不可变的分离。抽象类和接口就是定义为不可变的,而把可变的座位子类去实现。   
      9.好的接口定义应该是具有专一功能性的,而不是多功能的,否则造成接口污染。如果一个类只是实现了这个接口的中一个功能,而不得不去实现接口中的其他方法,就叫接口污染。   
     10.尽量避免使用继承来实现组建功能,而是使用黑箱复用,即对象组合。因为继承的层次增多,造成最直接的后果就是当你调用这个类群中某一类,就必须把他们全部加载到栈中!后果可想而知.(结合堆栈原理理解)。同时,有心的朋友可以留意到微软在构建一个类时,很多时候用到了对象组合的方法。比如asp.net中,Page类,有Server Request等属性,但其实他们都是某个类的对象。使用Page类的这个对象来调用另外的类的方法和属性,这个是非常基本的一个设计原则。   
     11.如果抽象类实现接口,则可以把接口中方法映射到抽象类中作为抽象方法而不必实现,而在抽象类的子类中实现接口中方法.
   
      四、抽象类和接口的使用:
      1. 如果预计要创建组件的多个版本,则创建抽象类。抽象类提供简单的方法来控制组件版本。
      2.如果创建的功能将在大范围的全异对象间使用,则使用接口。如果要设计小而简练的功能块,则使用接口。
      3.如果要设计大的功能单元,则使用抽象类.如果要在组件的所有实现间提供通用的已实现功能,则使用抽象类。   
      4.抽象类主要用于关系密切的对象;而接口适合为不相关的类提供通用功能。
--------------------编程问答-------------------- 接口关注的是属性和方法,抽象类继承关注的是类本身 --------------------编程问答-------------------- 我也一直受这个问题的困扰呢 --------------------编程问答--------------------
引用 2 楼 pcqpzq 的回复:
引用 1 楼 neohope 的回复:
 Google

 大家以后不要CSDN了???太敷衍了!!!

 看我的:
http://www.baidu.com/s?tn=youcome_dg&ie=UTF-8&wd=%E6%8A%BD%E5%83%8F%E7%B1%BB%E5%92%8C%E6%8E%A5%E5%8F%A3%E7%9A%84%E5%8C%BA%E5%88%AB&cl=3


不是人家敷衍,这问题问太多了,随便搜一下看看就有了,拿这个问题来这里,本身也就是想得到一些肤浅的答案而已。

当然,这里也有不少像P哥那样的行家里手,但行家的话估计也不是人人都能看得懂的。
但是,同一个问题,每个人所处的角度不同,所得到的结论不同。设计的从设计角度,编码的从编码角度。

也就是如P哥所说:“可以像一个“猴子”一样在不同的概念中挑来跳去,但是如果你真的跳累了,就会想到结论了。”。 --------------------编程问答-------------------- 简而言之:接口是一种契约,定义大家的行为。
抽象类是一个行为的抽象。
两者的具体操作,依照具体的情况而定。
在多态中两者都可用,但是具体的情况依照设计模式的要求来定。 --------------------编程问答-------------------- 记得有次去笔试中的一道题:

请谈谈什么是面向对象?

除了写一些书本上即有的小学生都能背会的答案外,还能怎样?

这个问题犹如“谈谈什么是人生?”一样,答曰“人生就是吃喝拉撒”,其实远远不止如此! --------------------编程问答-------------------- 路过。学习。 --------------------编程问答-------------------- 区别一,两者表达的概念不一样。抽象类是一类事物的高度聚合,那么对于继承抽象类的子类来说,对于抽象类来说,属于“是”的关系;而接口是定义行为规范,因此对于实现接口的子类来说,相对于接口来说,是“行为需要按照接口来完成”。这些听起来有些虚,举个例子。例如,狗是对于所有狗类动物的统称,京哈是狗,牧羊犬是狗,那么狗的一般特性,都会在京哈,牧羊犬中找到,那么狗相对于京哈和牧羊犬来说,就属于这类事物的抽象类型;而对于“叫”这个动作来说,狗可以叫,鸟也可以叫。很明显,前者相当于所说的是抽象类,而后者指的就是接口。 



区别二,抽象类在定义类型方法的时候,可以给出方法的实现部分,也可以不给出;而对于接口来说,其中所定义的方法都不能给出实现部分。 --------------------编程问答--------------------
引用 39 楼 sp1234 的回复:
当然,我(至少)5年来在面向对象技术上的观点始终是这样的:

.  面向对象分析与设计技术根本不是编程技术,不但可以给编程者使用,更是给广大的非编程者使用的。只是教育、教材的问题而已。

.  优秀的面向对象编程语言其实有很多种,例如Effiel、Smalltalk等都是。

.  我最有成就感的面向对象编程是很早以前使用纯c来全面实现的OO程序。不是使用非OOPL让我知道OO的本质用法而不纠缠于语言。

.  我注重架构设计,希望编程越少越好。


对于您的这几点,我都毫无异议地赞同,在这些问题上,我们没有不同意见。上次也是在CSDN,有位朋友问到,C语言中有没有类似泛型的东西。我给他的回答是,泛型的东西是对面向对象的一种支持,C语言不是面向对象语言,但是你可以使用面向对象的思想,在C语言里去实现你所需要的东西。换句话说,面向对象跟思想有关,而跟具体实现无关。
--------------------编程问答-------------------- 总结一下吧:
1、对于楼主的问题,属于技术范畴,这个问题的答案上面已经有不少回复已经说过了,不再重复
2、对于面向对象这一思想性问题,目前我和sp1234的观点一致
3、在具体的设计实践上,我并不认为区分了抽象类和接口就是一种不好的设计,我也不会认为,不去区分这些内容也是一种不好的设计。我认为设计没有好坏,没有合理与不合理,关键还需要看究竟这个设计是用来解决什么样的问题,而这些问题恰恰都是来自需求的。
--------------------编程问答-------------------- 学习 --------------------编程问答-------------------- 隔一段时间就会有问这个的贴出现,你提问的时候没见下面有很多同样的提问? --------------------编程问答-------------------- 这两个的区别看看书就该知道了吧
我觉得应该先把基础学习好 --------------------编程问答-------------------- 来看吵架的
偷偷学习 --------------------编程问答-------------------- 这么多高手啊,看着lz的结贴率真是个狂汗啊.. --------------------编程问答--------------------
引用 2 楼 pcqpzq 的回复:
引用 1 楼 neohope 的回复:
Google

大家以后不要CSDN了???太敷衍了!!!

看我的:
http://www.baidu.com/s?tn=youcome_dg&ie=UTF-8&wd=%E6%8A%BD%E5%83%8F%E7%B1%BB%E5%92%8C%E6%8E%A5%E5%8F%A3%E7%9A%84%E5%8C%BA%E5%88%AB……


给你补充:

http://www.google.com.hk/search?hl=zh-CN&source=hp&q=%E6%8A%BD%E5%83%8F%E7%B1%BB%E5%92%8C%E6%8E%A5%E5%8F%A3%E7%9A%84%E5%8C%BA%E5%88%AB&btnG=Google+%E6%90%9C%E7%B4%A2 --------------------编程问答--------------------
引用 10 楼 flyfly2008 的回复:
类是对象的抽象。
抽象类是对类的抽象
接口是对行为的抽象。

经典 --------------------编程问答-------------------- 看看,然后收藏! --------------------编程问答-------------------- to:sp1234

回答很有耐心 如果CSDN都像你这样就好了

以后有问题还需要你多照顾点 --------------------编程问答-------------------- 像这样的问题 你不应该 提出来  。。人家都不知道 回答多少编了 
--------------------编程问答--------------------  抽象类与接口的区别
     * 
    相同点 
    ●都不能被直接实例化,都可以通过继承实现其抽象方法。 
    ●都是面向抽象编程的技术基础,实现了诸多的设计模式。 
    不同点 
    ●接口支持多继承;抽象类不能实现多继承。 
    ●接口只能定义抽象规则;抽象类既可以定义规则,还可能提供已实现的成员。 
    ●接口是一组行为规范;抽象类是一个不完全的类,着重族的概念。 
    ●接口可以用于支持回调;抽象类不能实现回调,因为继承不支持。 
    ●接口只包含方法、属性、索引器、事件的签名,但不能定义字段和包含实现的方法;抽象类可以定义字段、属性、
     * 包含有实现的方法。
    ●接口可以作用于值类型和引用类型;抽象类只能作用于引用类型。例如,Struct就可以继承接口,而不能继承类。 
       通过相同与不同的比较,我们只能说接口和抽象类,各有所长,但无优略。在实际的编程实践中,
     * 我们要视具体情况来酌情量才,但是以下的经验和积累,或许能给大家一些启示,除了我的一些积累之外,
     * 很多都来源于经典,我相信经得起考验。所以在规则与场合中,我们学习这些经典,最重要的是学以致用,
     * 当然我将以一家之言博大家之笑,看官请继续。 
    规则与场合 
    1.请记住,面向对象思想的一个最重要的原则就是:面向接口编程。 
    2.借助接口和抽象类,23个设计模式中的很多思想被巧妙的实现了,我认为其精髓简单说来就是:面向抽象编程。 
    3.抽象类应主要用于关系密切的对象,而接口最适合为不相关的类提供通用功能。 
    4.接口着重于CAN-DO关系类型,而抽象类则偏重于IS-A式的关系; 
    5.接口多定义对象的行为;抽象类多定义对象的属性;  
    6.接口定义可以使用public、protected、internal 和private修饰符,但是几乎所有的接口都定义为public,
     * 原因就不必多说了。 
    7.“接口不变”,是应该考虑的重要因素。所以,在由接口增加扩展时,应该增加新的接口,而不能更改现有接口。 
    8.尽量将接口设计成功能单一的功能块,以.NET Framework为例,IDisposable、IComparable、IEquatable、
     * IEnumerable等都只包含一个公共方法。 
    9.接口名称前面的大写字母“I”是一个约定,正如字段名以下划线开头一样,请坚持这些原则。 
    10.在接口中,所有的方法都默认为public。  
    11.如果预计会出现版本问题,可以创建“抽象类”。例如,创建了狗(Dog)、鸡(Chicken)和鸭(Duck),
     * 那么应该考虑抽象出动物(Animal)来应对以后可能出现风马牛的事情。而向接口中添加新成员则会强制要求
     * 修改所有派生类,并重新编译,所以版本式的问题最好以抽象类来实现。 
    12.从抽象类派生的非抽象类必须包括继承的所有抽象方法和抽象访问器的实实现。 
    13.对抽象类不能使用new关键字,也不能被密封,原因是抽象类不能被实例化。 
    14.在抽象方法声明中不能使用 static 或 virtual 修饰符。 

 

1。数据成员和方法 

      abstract class可以有自己的数据成员,也可以有非abstract的方法。而在interface中,数据成员必须是静态

的且不能修改的(static final),所有的方法都必须是abstract的。

2。继承与实现

     对于abstract class,一个类只能使用一次继承关系,即一个类只能继承一个abstract class。而对于interface

,一个类可以实现多个interface。

3。方法默认行为

在abstract class定
--------------------编程问答-------------------- 收藏此贴,看后大受启发! --------------------编程问答-------------------- --------------------编程问答-------------------- 谈这么多区别其实没有什么用处

关键要知道什么场合下用什么最合适? --------------------编程问答-------------------- --------------------编程问答-------------------- class 类,  信息分类, 把一类的信息放到一起, 抽象类也是类

interface 接口, 功能的集合, 说明这些执行的类上有这些功能,是一种功能契约 --------------------编程问答-------------------- 五楼的很棒 --------------------编程问答--------------------
引用 5 楼 projectdd 的回复:
接口
1,可多继承
2,只能有定义不能有实现
抽象类
1,不可多继承
2,可有定义,可有实现


简练。
补充:.NET技术 ,  C#
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,