`
xyue13
  • 浏览: 13306 次
  • 性别: Icon_minigender_1
  • 来自: 宜昌
社区版块
存档分类
最新评论

也谈接口和抽象类区别(一)

阅读更多
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工作所定义的规范,但是呢,他们(类)的发展并不受到父类的影响,张三、李四、王五都可以自由的发展自身类,具备有很高的自由度,我们再来从面向对象设计角度看,李四、王五继承人(因为他本质就是人),实现了工作。
应该说,接口的使用面比抽象类更广一些,而抽象类呢比接口更具限制性,体现的是继承关系。
当类的发展不需要受到限制和约束时,我们可以使用接口,此类可以自由的发展,此时继承接口的这个类它就是一个稳定的类,这也体现了接口保持类的稳定性。


这两者具备有很大的相似性,都源直面向对象思想,在使用何时抽象类,何时接口并没有一个定论,应该根据自己程序的大小,设计的方式,程序发展的空间来看,这就需要大家自己斟酌了。
分享到:
评论

相关推荐

    C#类和接口、虚方法和抽象方法及值类型和引用类型的区别等等.........

    这里有好多比较好的资料,很适合正在学习Java和对Java想进一步了解的朋友. 如: 一.C#类和接口、虚方法和抽象方法及值类型和引用类型的区别 二 .C#中 接口与抽象类 的区别 三....抽象类和接口的区别

    浅谈Java抽象类和接口的个人理解

    主要介绍了浅谈Java抽象类和接口的个人理解,具有一定借鉴价值,需要的朋友可以参考下。

    Python3之接口类(InterfaceClass)浅谈

    日期:2020年3月14日 作者:Commas 注释:学习就是为了忘记,什么是接口类,怎么将方法变为属性; 如果您想了解更多有关Python的知识,那么...定义一个接口类,我们需要abc模块(抽象类基类,Abstract Base Classes)中

    计算机科学与编程中的抽象学.pdf

    第4章 抽象了的运行系统和虚拟机上的抽象编程(面向程序员的抽象编程) 因为编程都是解决运行问题跟语言语法本身问题的双重过程,所以,对于寻求更高级的编程支持(目前我们谈到的是C这样的系统实现语言),唯有改变...

    从实例谈面向对象编程、工厂模式和重构

    不过不用着急,因为接口这个利器你还没有用上 (虽然你也可以用抽象类,但在 C#里只支持类的单继承)。 虽然视频和音频格式不同,别忘了,他们都是媒体中的一种,很多时候,他们有许多相似的功能,比如播 放。根据...

    设计模式 创建型模式 Abstract Factory模式(抽象工厂)

    抽象出一些类的公共接口作为抽象基类或者接口。这 样的话,我们将会面临一个挑战。在每次使用子类的时候,我们不得不经常使用base* = New XXX (这也无可厚非,但当系统复杂 后,我们可能将无法维护子类的创建),...

    Java入门1·2·3:一个老鸟的Java学习心得.PART3(共3个)

    基本信息 作者: 臧萌 出版社:清华大学出版社 ISBN:9787302217831 ...12.2.5 接口——让类集多重类型于一身 344 12.2.6 简化recordTransport()方法 347 12.3 再探接口 349 12.3.1 重温上节中的程序 349...

    net学习笔记及其他代码应用

    Abstract 类的子类为它们父类中的所有抽象方法提供实现,否则它们也是抽象类为。取而代之,在子类中实现该方法。知道其行为的其它类可以在类中实现这些方法。 接口(interface)是抽象类的变体。在接口中,所有方法...

    JAVA入门1.2.3:一个老鸟的JAVA学习心得 PART1(共3个)

    基本信息 作者: 臧萌 出版社:清华大学出版社 ISBN:9787302217831 ...12.2.5 接口——让类集多重类型于一身 344 12.2.6 简化recordTransport()方法 347 12.3 再探接口 349 12.3.1 重温上节中的程序 349...

    二十三种设计模式【PDF版】

    和智慧,让你能够真正掌握接口或抽象类的应用,从而在原来的 Java 语言基础上跃进一步,更重要的是,GoF 的设计模式反复 向你强调一个宗旨:要让你的程序尽可能的可重用。 这其实在向一个极限挑战:软件需求变幻...

    设计模式 创建型模式 Complex Factory模式(复杂工厂)

    为了应对这种变化我们抽象出它比较稳定的接口,隔离出“这个易变对象”的变化,从而保持系统中“其它依赖该对象的对象”不随着需求的改变而改变,这就是我们经常谈的Factory模式了。 详细见博客 ...

    设计模式 创建型模式 Simple Factory模式(简单工厂)

    抽象出一些类的公共接口作为抽象基类或者接口。这样的话,我们将会面临一个挑战。在每次使用子类的时候,我们不得不经常使用base* = New XXX (这也无可厚非,但当系统复杂后,我们可能将无法维护子类的创建),最终...

    21天学通Java-由浅入深

    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_信息...

    浅谈Python中的继承

    尽可能的继承接口类,在子类中实现方法,鼓励对接口类的多继承,这样遵循接口隔离原则,有利于归一化设计,不提倡对抽象类进行多继承 实现继承:子类不需要实现任何东西,直接使用父类接口和实现会增强代码的耦合性...

    写给大家看的面向对象编程书(第3版).[美]Matt Weisfeld(带详细书签).pdf

    第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 ...

    Think in ActionScript 3.0Ⅰ Ⅱ Ⅲ汇总

    5.6 抽象类的概念 5.7 对象转型(Casting) 6. 接口(Interface) 6.1 接口的概念 6.2 依赖倒转原则(Dependence Inversion Principle) 6.3 实现接口的原则 6.4 TestInterFaceAccess.as —— 实现多个接口 6.5 接口...

    超爽的自学课件(java)

    1) 第1章:对象入门 这一章是对面向对象的程序设计(OOP)的一个综述,其中包括对“什么是对象”之类的基本问题的回答,并讲述了接口与实现、抽象与封装、消息与函数、继承与合成以及非常重要的多形性的概念。...

    C++入门到精通

    并说明了如何定义和处理我们自己的异常类层次结构 这一章也深入讨论了在继承机制下重 载函数的解析过程 第 20 章详细说明了如何使用 C++的iostream输入/输出库 它通过例子说明了一般的数 据输入和输出 说明了...

    谈应用程序内在质量的改善

    谈应用程序内在质量的改善软件...架构设计是高层次的往往只抽象出相关的类和包,对于每一个类中应该设计哪些方法和函数,并如何组织这些方法和子函数的调用关系,还必须进行详细设计,这是编码的可维护性和可扩展性的两个最

Global site tag (gtag.js) - Google Analytics