没有合适的资源?快使用搜索试试~ 我知道了~
火龙果软件工程技术中心 经常可以从开发人员口中听到“面向对象”这个词:场景1、A:我今天开始用面向对象的方法设计程序了!B:你怎么做的?A:我把保存文件、加载文件封装成了一个类,以后只要调用这个类就可以实现文件操作了。场景2、A:我开始学习Java了,面向对象的语言,你不要再学VB了,好土呀!B:VB怎么了?A:VB是面向过程的,已经过时了,Java中都是类,很时髦!B:VB中也有类呀!A:(无语)场景3、A:面向对象思想就是好呀,我真的离不开Java了!B:你又用什么高超技术了?A:我今天从一个操纵数据库的类继承了一个子类,然后重写了它的保存到数据库的方法,然后把数据通过Socket发送到
资源推荐
资源详情
资源评论
重新认识面向对象重新认识面向对象
火龙果软件工程技术中心
经常可以从开发人员口中听到经常可以从开发人员口中听到“面向对象面向对象”这个词:这个词:
场景1、
A:我今天开始用面向对象的方法设计程序了!
B:你怎么做的?
A:我把保存文件、加载文件封装成了一个类,以后只要调用这个类就可以实现文件操作了。
场景2、
A:我开始学习Java了,面向对象的语言,你不要再学VB了,好土呀!
B:VB怎么了?
A:VB是面向过程的,已经过时了,Java中都是类,很时髦!
B:VB中也有类呀!
A:(无语)
场景3、
A:面向对象思想就是好呀,我真的离不开Java了!
B:你又用什么高超技术了?
A:我今天从一个操纵数据库的类继承了一个子类,然后重写了它的保存到数据库的方法,然后把数据通过Socket发送到了远
程客户端了,而调用者根本不知道,哈哈!
场景4、
A:我推荐你用的Java不错吧?
B:真是不错,面向对象就是好,JDK里边也有好多好多的类可以用,不用像在VB里边那样要去查API文档了。
A:但是我听说现在又出了个面向方面编程,咱们看来又落伍了呀,看来做编程真的不是长久之计。
写几个类就是面向对象了吗?继承父类就是为了重用父类的代码吗?覆盖父类的方法就可以瞒天过海了吗?VB中也有类,它
是面向对象吗?
1.1
类与对象
“类”和“对象”是面向对象编程中最基本的概念,从语言的角度来讲,“类”是用户自定义的具有一定行为的数据类型,“对象”则
是“类”这种数据类型的变量。通俗的讲,“类”是具有相同或相似行为的事物的抽象,“对象”是“类”的实例,是是一组具有相关性
的代码和数据的组合体,是有一定责任的实体。
类本身还可以进一步抽象为类型,类型是一种更高层次上的抽象,它只用来描述接口,比如抽象类和接口就是一种类型。当一
个类型的接口包含另外一个类型的接口时,我们就可以说它是此类型的子类型。类型是用来标识特定接口的,如果一个对象接
受某个接口定义的所有行为,那么我们就可以说该对象具有该类型。一个对象同时拥有多种类型。
面向对象编程的特性
面向对象编程有三个特性:封装,继承,多态。这三个特性从低级到高级描述了面向对象的特征。一种语言只有同时具备这三
种特性才能被称为面向对象的语言。VB中也有类,它的类也支持封装和简单的继承,但是它不支持所有的继承语义和多态,
因此VB只能被称为基于对象的语言。
封装是所有抽象数据类型(ADT)的特性,很多刚刚接触面向对象的人认为封装就是就是面向对象。将程序按照一定的逻辑分
成多个互相协作的部分,并将对外界有用的稳定的部分暴露出来,而将会发生的改变隐藏起来,外界只能通过暴露的部分向这
个对象发送操作请求从而享受对象提供的服务,而不必管对象内部是如何运行的,这就是封装。理解封装是理解面向对象的第
一个步骤,40%的程序员对面向对象的理解仅停留在封装这个层次。
继承也称为派生,继承关系中,被继承的称为基类,从基类继承而得的被称为派生类或者子类。继承是保持对象差异性的同时
共享对象相似性的复用。能够被继承的类总是含有并只含有它所抽象的那一类事务的共同特点。继承提供了实现复用,只要从
一个类继承,我们就拥有了这个类的所有行为。理解继承是理解面向对象的第二个步骤,50%的程序员对面向对象的理解仅停
留在继承这个层次。语义上的“继承”表示“是一种(is-a)”的关系。很多人体会到了继承在代码重用方面的优点,而忽视了继承
的语义特征。于是很多滥用继承的情况就发生了,关于这一点我们将会在后边介绍。
多态是“允许用户将父对象设置成为一个或更多的它的子对象相等的技术,赋值后,基类对象就可以根据当前赋值给它的派生
类对象的特性以不同的方式运作”(Charlie Calvert)。多态扩大了对象的适应性,改变了对象单一继承的关系。多态是行为的
抽象,它使得同名方法可以有不同的响应方式,我们可以通过名字调用某一方法而无需知道哪种实现将被执行,甚至无需知道
执行这个实现的对象类型。多态是面向对象编程的核心概念,只有理解了多态,才能明白什么是真正的面向对象,才能真正发
挥面向对象的最大能力。不过可惜的是,只有极少数程序员能真正理解多态。
对象之间的关系
对象之间有两种最基本的关系:继承关系,组合关系。
继承关系
继承关系可以分为两种:一种是类对接口的继承,被称为接口继承;另一种是类对类的继承,被称为实现继承。继承关系是一
种“泛化/特化”关系,基类代表一般,而派生类代表特殊。
组合关系。
组合是由已有的对象组合而成新对象的行为,组合只是重复运用既有程序的功能,而非重用其形式。组合与继承的不同点在于
它表示了整体和部分的关系。比如电脑是由CPU、内存、显示器、硬盘等组成的,这些部件使得电脑有了计算、存储、显示
图形的能力,但是不能说电脑是由CPU继承而来的。
1.2
对象之间有两种最基本的关系:继承关系,组合关系。通过这两种关系的不断迭代组合最终组成了可用的程序。但是需要注意
的就是要合理使用这两种关系。
派生类是基类的一个特殊种类,而不是基类的一个角色。语义上的“继承”表示“is-a”(是一种)的关系,派生类“is-a”基类,这
是使用继承关系的最基本前提。如果类A是类B的基类,那么类B应该可以在任何A出现的地方取代A,这就是“Liskov代换法则
(LSP)”。如果类B不能在类A出现的地方取代类A的话,就不要把类B设计为类A的派生类。
举例来说,“苹果”是“水果”的派生类,所以“水果是植物的果实”这句话中的“水果”可以用“苹果”来代替:“苹果是植物的果实”;
而“苹果”不是“香蕉”的派生类,因为“香蕉是一种种子退化的了的植物果实”不能被“苹果”替换为“苹果是一种种子退化的了的植物
果实”。
举这个例子好像有点多余,不过现实的开发中却经常发生“苹果”从“香蕉”继承的事情。
某企业中有一套信息系统,其中有一个“客户(Customer)”基础资料,里边记录了客户的名称、地址、email等信息。后来系
统要进行升级,增加一个“供应商(Supplier)”基础资料,开发人员发现“供应商”中有“客户”中的所有属性,只是多了一个“银行
帐号”属性,所以就把“供应商”设置成“客户”客户的子类。
图 2.1
到了年终,老板要求给所有的客户通过Email发送新年祝福,由于“供应商”是一种(is-a)“客户”,所以系统就给“供应商”和“客
户”都发送了新年祝福。第二天很多供应商都感动流涕的给老板打电话“谢谢老板呀,我们供应商每次都是求着贵公司买我们的
东西,到了年终你们还忘不了我们,真是太感谢了!”。老板很茫然,找来开发人员,开发人员这才意识到问题,于是在发送
Email的程序里做了判断“如果是供应商则不发送,否则发送”,一切ok了。到了年初,老板要求给所有很长时间没有购买他们
产品的“客户”,打电话进行问候和意见征集。由于“供应商”是一种(is-a)“客户”,所以第二天电话里不断出现这样的回答:“你
们搞错了吧,我们是你们的供应商呀!”。老板大发雷霆,开发人员这才意识到问题的严重性,所以在系统的所有涉及到客户
的地方都加了判断“如果是供应商则……”,一共修改了60多处,当然由于疏忽遗漏了两处,所以后来又出了一次类似的事故。
我们可以看到错误使用继承的害处了。其实更好的解决方案应该是,从“客户”和“供应商”中抽取一个共同的基类“外部公司”出
来:
剩余8页未读,继续阅读
资源评论
weixin_38703295
- 粉丝: 10
- 资源: 935
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功