http://www.cnblogs.com/KeithDan/archive/2007/05/21/754164.html
好象这是一个老生常谈的问题,最近有个学生问我他们的区别,于是我就又想起这个话题。
有不少的文章在描述这两者,但好象都没有怎么从初学者的浅显角度来看。
其实这两者有很多相识之处,当然也有很多不同之处。要理解它们,应该先从面向对象思想开始。面向对象思想里面,最基本的就是封装,继承和多态。所谓封装,说的小,方法(函数)也就是对一种操作的封装,说的大,用类来描述一个具体的对象。
那么在面向对象程序中应该说对封装还有一层新的定义,即将类的描述抽象化,也就是说描述类的外貌而不去考虑它的实际。
那么我们回过头来看抽象类,它必须被继承使用,描述的其实是一种继承关系,即"is a"的关系。类继承它,也就是说类拥有它所有抽象方法等,那么也就是类遵循了它所定义的规范。但是呢,这种规范是通过继承而来,类的发展必须依赖它的父类。
abstract class 工作
{
abstract void 上班()
}
class 张三 : 工作{}
abstract class 工作
{
abstract void 上班()
}
class 人: 工作{}
class 李四 : 人{}
我们从这个例子中不难看出,张三和李四同样都遵循抽象工作的规范,都拥有上班这个方法,但是呢,他们的发展始终受到父类的影响。
当然,我这里只是从它们使用的角度来看,我们还能从他们设计角度度来看。上面我们虽然实现了人.上班()的过程,但是,这却违反了面向对象设计中的一个核心原则ISP(Interface Segregation Priciple),我们把李四的作为人的行为和他工作的行为混在一起。
那我们再来看看接口(interface),引用航天奇侠兄的一句话,接口,就是一个类的函数规范。 一个类 “继承”一个接口,等于说这个类必须提供接口所要求的所有函数。但是呢他们是一种实现关系,虽然在C#里我们还叫它为继承接口,但实际它是一种"like a"的关系。
interface 工作
{
public void 上班();
}
class 张三 : 工作{}
interface 工作
{
public void 上班();
}
class 人 {}
class 李四 : 人,工作{}
interface 工作
{
public void 上班();
}
class 动物 {}
class 人 : 动物 {}
class 王五 : 人,工作{}
此时我们来看,张三和李四同样遵循着interface工作所定义的规范,但是呢,他们(类)的发展并不受到父类的影响,张三、李四、王五都可以自由的发展自身类,具备有很高的自由度,我们再来从面向对象设计角度看,李四、王五继承人(因为他本质就是人),实现了工作。
应该说,接口的使用面比抽象类更广一些,而抽象类呢比接口更具限制性,体现的是继承关系。
当类的发展不需要受到限制和约束时,我们可以使用接口,此类可以自由的发展,此时继承接口的这个类它就是一个稳定的类,这也体现了接口保持类的稳定性。
这两者具备有很大的相似性,都源直面向对象思想,在使用何时抽象类,何时接口并没有一个定论,应该根据自己程序的大小,设计的方式,程序发展的空间来看,这就需要大家自己斟酌了。
分享到:
相关推荐
这里有好多比较好的资料,很适合正在学习Java和对Java想进一步了解的朋友. 如: 一.C#类和接口、虚方法和抽象方法及值类型和引用类型的区别 二 .C#中 接口与抽象类 的区别 三....抽象类和接口的区别
主要介绍了浅谈Java抽象类和接口的个人理解,具有一定借鉴价值,需要的朋友可以参考下。
日期:2020年3月14日 作者:Commas 注释:学习就是为了忘记,什么是接口类,怎么将方法变为属性; 如果您想了解更多有关Python的知识,那么...定义一个接口类,我们需要abc模块(抽象类基类,Abstract Base Classes)中
第4章 抽象了的运行系统和虚拟机上的抽象编程(面向程序员的抽象编程) 因为编程都是解决运行问题跟语言语法本身问题的双重过程,所以,对于寻求更高级的编程支持(目前我们谈到的是C这样的系统实现语言),唯有改变...
不过不用着急,因为接口这个利器你还没有用上 (虽然你也可以用抽象类,但在 C#里只支持类的单继承)。 虽然视频和音频格式不同,别忘了,他们都是媒体中的一种,很多时候,他们有许多相似的功能,比如播 放。根据...
抽象出一些类的公共接口作为抽象基类或者接口。这 样的话,我们将会面临一个挑战。在每次使用子类的时候,我们不得不经常使用base* = New XXX (这也无可厚非,但当系统复杂 后,我们可能将无法维护子类的创建),...
基本信息 作者: 臧萌 出版社:清华大学出版社 ISBN:9787302217831 ...12.2.5 接口——让类集多重类型于一身 344 12.2.6 简化recordTransport()方法 347 12.3 再探接口 349 12.3.1 重温上节中的程序 349...
Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 接口(interface)是抽象类的变体。在接口中,所有方法...
基本信息 作者: 臧萌 出版社:清华大学出版社 ISBN:9787302217831 ...12.2.5 接口——让类集多重类型于一身 344 12.2.6 简化recordTransport()方法 347 12.3 再探接口 349 12.3.1 重温上节中的程序 349...
和智慧,让你能够真正掌握接口或抽象类的应用,从而在原来的 Java 语言基础上跃进一步,更重要的是,GoF 的设计模式反复 向你强调一个宗旨:要让你的程序尽可能的可重用。 这其实在向一个极限挑战:软件需求变幻...
为了应对这种变化我们抽象出它比较稳定的接口,隔离出“这个易变对象”的变化,从而保持系统中“其它依赖该对象的对象”不随着需求的改变而改变,这就是我们经常谈的Factory模式了。 详细见博客 ...
抽象出一些类的公共接口作为抽象基类或者接口。这样的话,我们将会面临一个挑战。在每次使用子类的时候,我们不得不经常使用base* = New XXX (这也无可厚非,但当系统复杂后,我们可能将无法维护子类的创建),最终...
174 9.1 什么是接口 174 9.1.1 接口的定义 174 9.1.2 访问接口里的常量 176 9.2 接口的使用 177 9.2.1 接口里的方法如何创建 177 9.2.2 接口引用怎么使用 178 9.3 什么是抽象类 180 9.3.1 抽象类的使用和特点 ...
14_信息系统框架集成第三方产品案例_socket抽象类和框架搭建__传智扫地僧 15_信息系统框架集成第三方产品案例_框架实现第一个socket类厂商实现 16_信息系统框架集成第三方产品案例_第二个socket类厂商实现 17_信息...
尽可能的继承接口类,在子类中实现方法,鼓励对接口类的多继承,这样遵循接口隔离原则,有利于归一化设计,不提倡对抽象类进行多继承 实现继承:子类不需要实现任何东西,直接使用父类接口和实现会增强代码的耦合性...
第8章 框架与重用:使用接口和抽象类实现设计 119 8.1 代码:重用还是不重用 119 8.2 什么是框架 119 8.3 什么是契约 121 8.3.1 抽象类 122 8.3.2 接口 124 8.3.3 集成 125 8.3.4 编译器的证明 127 8.3.5 ...
5.6 抽象类的概念 5.7 对象转型(Casting) 6. 接口(Interface) 6.1 接口的概念 6.2 依赖倒转原则(Dependence Inversion Principle) 6.3 实现接口的原则 6.4 TestInterFaceAccess.as —— 实现多个接口 6.5 接口...
1) 第1章:对象入门 这一章是对面向对象的程序设计(OOP)的一个综述,其中包括对“什么是对象”之类的基本问题的回答,并讲述了接口与实现、抽象与封装、消息与函数、继承与合成以及非常重要的多形性的概念。...
并说明了如何定义和处理我们自己的异常类层次结构 这一章也深入讨论了在继承机制下重 载函数的解析过程 第 20 章详细说明了如何使用 C++的iostream输入/输出库 它通过例子说明了一般的数 据输入和输出 说明了...
谈应用程序内在质量的改善软件...架构设计是高层次的往往只抽象出相关的类和包,对于每一个类中应该设计哪些方法和函数,并如何组织这些方法和子函数的调用关系,还必须进行详细设计,这是编码的可维护性和可扩展性的两个最