面向对象的重新思考

   

     在刚开始学习一门面向对象语言的时候,我们是这样写代码的:

     我们会先写一个小狗类,然后new它,最后调用它的方法实现功能。

 

          例如:

 

                   Dog d=new Dog();//造个小狗

                   d.shout();//小狗看到stranger会叫

 

        看得懂这段代码,说明你的面向过程语言基础学的不错~~~~~

      好的,这段代码先到这里,我们先来谈谈面向对象的特征:

1,抽象:

 

         首先想想我们在什么时候用到抽象?

         a.当我在设计一个系统的时候,我需要把一些东西归类,比如,小狗,小猫,这些都会做一个animal类,然后让小狗小猫继承这个animal.这是基本的类抽象

 

         b.还有一类抽象,比如我们写个接口,让一个类去实现这个接口,这是接口的抽象;(抽象类的抽象和接口的抽象是一样的,都没有方法体,都要子类去具体实现);

 

        c.类的成员变量使用超类或接口:

 

       当某个类作为另一个类C的成员变量的时候,而这个子类又有诸多变化,这时我们就要考虑将这个变化的部分做成多个子类,并且将这多个子类抽象出来一个父类,将这个父类作为类C 的成员变量。

        比如,我现在有个很多收费策略,然后在类C中有一个要调用计算收费的方法,但是因为调用时的诸多情况,我必须在调用时动态确定使用哪种收费策略,所以,在定义这个C的成员变量时,我们就要使用抽象出来的父类了,即为众多的策略定义一个父类或接口。

       这时情况又和上面的小猫小狗的情况一样了。而且预先设计中的抽象和重构方法时的抽象目的是相同的,都是为了系统的扩展性,易修改。

 

        总的来看,抽象起到了一个概括的作用,就像拿着一条摸起来凉凉的,张的长长的,吐着舌头的东西问你,知道这是什么吗?你不确定这是哪种蛇,但是,你会非常肯定的回答:这是条蛇!这样的回答虽然不准确,但是却给了你百度的时间,等你百度过后,你就可以说:这是条@#$@#蛇。。。。

   

 

2,封装

 

      封装能带来什么好处呢:

       1,首先,想想你使用过的实体类,你能很快写出这个是学生的ID,这个是教师的ID。。。这里,封装实体的数据,起到了一个打包的作用,将属性绑定到了类上,方便查找和使用,上面列举的是对于属性的封装。类中也有方法啊,所以,同样,也有方法的封装。

 

      2,回想设计模式,有些对象的创建过程我们是无需参与的:例如,在单例模式中,我们将类之创建一个实例的过程交给类本身来处理,将类的创建封装在了类里面,避免了创建多个实例; 还有我们熟悉的各种工厂模式,我们将对象的创建迁移到了具体的工厂类里面,去除了选择问题。

 

       3,对类行为的封装

回想一下命令模式,我们把各个命令做成类,将请求操作的对象和执行操作的对象分开了,接触了这里的紧耦合。

 

 

3,继承

 

      在面向对象的设计中,我们是免不了使用继承的,首先,来看一下公认的使用继承带来的那些好处:

 

     a.基本好处:

          可以继承父类的属性和方法,获得父类的行为。例如,我们在使用模板方法的时候,将重复的东西都放到父类,子类只需在继承父类的基础上做一个很小的变更就ok了。

 

    b.通过继承达到“类型匹配”

  

     在装饰者模式中,我们让服饰类去继承people,这在现实中是不可理喻的,但是在设计中,正是通过这个继承,让我们可以在形象展示中层层调用父类的方法,达到一个装饰的效果。感觉这个模式设计的非常酷!!!

 

 

     但是,继承的后果你想过吗?

 

      1,多继承的后果:C++强大的多继承为代码的复用提供了很大的方便,但是也带来了很多问题,比如多继承的二义性问题,还有继承关系的混乱问题;

 

      2,为了复用而使用的继承会给维护增加的子类带来困难,因为子类很可能不具有它从父类继承的方法,而且它也无法屏蔽从父类里面继承的方法。就像是富二代老爸想给儿子安排接手自己公司可是儿子却偏偏想去玩儿音乐。如果子类不需要父类的方法或者根本不能去实现父类的方法,这就让继承关系带来了一个非常尴尬的事情。

 

 

       面对继承可能带来的后遗症,所以,我们才才有了后来的提倡使用组合取代继承。

 

 

4,多态

 

    如果说面向对象为什么可扩展性这么强,而且非常灵活的原因,感觉多态起了很大的作用。

 

    首先,回到我们开始的小狗的问题上:

 

         Dog d=new Dog();//造个小狗

         d.shout();//小狗看到stranger会叫

 

 

      如果有一天,我不想听小狗叫了,我想听猫叫了,这时,可能我们会这样写:

 

           //Dog d=new Dog();//造个小狗

           //d.shout();//小狗看到stranger会叫

 

           Cat c=new Cat();

           c.shout();

 

       但是,过了两天,我又想听鸡叫了,这时,你可能又把小猫的代码注释掉,改成鸡叫的代码,但是,作为一个程序员,你要认识到,一段相似的代码写到第三遍了,那么一定是设计的有问题。

 

      这时,多态的作用就显示出来,这也是为什么在编程中一直强调的写法:将父类的引用指向子类的对象。

 

       如果我们使用了这种写法:

 

             Animala=new Cat();

             a.shout();

 

        那么,我们日后的变更将更加方便,当我们要变更具体的实现的时候,只要稍加改动就好啦!

    

        另外,还有重写,重载等多态的表现,但是还是觉得上面的最经典。

 

 

 

PS:最近在学习Java+Head first,感觉这是我真正迈入面向对象大门的开始~~~

 

时间: 2024-10-27 02:18:14

面向对象的重新思考的相关文章

原生 javascript 面向对象分析及思考

面向对象语言有三个特征:  封装,继承,多态.而js初学者一般会觉得js同其他类C语言一样,有类似于Class这样的关键字可以让我们在js中更好的进行面向对象的操作.可事实并非如此. 严格地说,js不是一门面向对象的语言,但是我们可以利用js里面的一些高级特性来进行OOP编程.  ----封装 在js中,如何来创建一个对象呢?这非常简单,我们只需要new一个已封装好的函数(就是类C语言中的类),就可以实例化一个对象了. 那我们首先来构造这么一个"类",在构造之前必须知道一个类需要有&q

.NET语言的选择

.NET语言的选择 导 读:每个组织迁移到.NET将选择采用哪种.NET语言.微软提供了四种语言:C#, VB.NET, 可管理的C++和 JScript.本文简要的讨论了我们关于这些语言和哪种语言将被使用的看法. 原文出处:http://www.dotnetdan.com/articles/misc/LanguageChoice.htm 每个组织迁移到.NET将选择采用哪种.NET语言.微软提供了四种语言:C#, VB.NET, 可管理的C++和 JScript.本文简要的讨论了我们关于这

.NET语言的选择 [特别推荐] (转贴)

导 读:每个组织迁移到.NET将选择采用哪种.NET语言.微软提供了四种语言:C#, VB.NET, 可管理的C++和 JScript.本文简要的讨论了我们关于这些语言和哪种语言将被使用的看法. --------------------------------------------------------------------------------翻译整理:51dotnet.com(高飞家族) 原文出处:http://www.dotnetdan.com/articles/misc/Lang

JPA2.1 中三个提升应用性能的新功能

经常在网上看到开发者们抱怨 JPA 性能低下的帖子或文章,但如果仔细查看这些性能问题,常会发现导致问题的根本原因大致包括以下几个: 使用过多的 SQL 查询从数据库中获取所需的实体信息,即我们常说的n+1查询问题 逐个更新实体,而不是使用单条语句进行更新 使用 Java 应用程序而非数据库进行大量数据处理 JPA提供了处理这类问题的方法,并给 JPA2.1 增加了一些额外功能,可以极大地提升性能表现,笔者将在本文中解释如何利用 JPA2.1 的功能避免上述问题. 顺便提一下,如果想了解Java项

VC++学习方法及书籍推荐 .

现在的计算机图书发展的可真快,很久没去书店,昨日去了一下,真是感叹万千,很多陌生的出版社,很多陌生的作者,很多陌生的译者,书名也是越来越夸张,什么××天精通××,精通××编程, ××宝典等等,书的印刷质量真的很好,纸张的质量也是今非昔比啊,但书的内容好象却是越来越让人失望,也许是我老了,我的思想我的观念已脱离现实社会,也许是外面的世界变化得太快,我编程数月,出去一走,路已不是原来的路--回家看着书架上的旧书发呆,听着李克勤的旧欢如梦,才发现自已原来太喜欢怀旧. 笔者从事软件开发多年,其中有两年多

win8 开发之旅(13) --webabcd大师,这事你怎么看? 向webabcd大师致敬。

首先,注明:以下的对话,纯属虚构.如有雷同,纯属巧合. 人物介绍:Webabcd大师--江湖人称姓王名磊,微软的mvp(最有价值专家),.net界一等一的高手.小曾--silverlight小白. 时间地点:2012年9月的一天,在一次北京举行的.net爱好者的聚会上.webabcd大师,做了一个关于的silverlight的演讲的以后,与会人员自由交流之时. 首先,大师之所以是大师,不仅仅是因为是在技术水平的登峰造极.而且是因为其做人生修为上的高山仰止.所以,这位大师不知疲倦的解开了小曾这个s

又一波Java专业人士必备书籍来袭_java

Java 专业人士必备的书籍大放送: 每个程序员都会有一些由于经常被当作专业资料参阅而磨坏的书.下列书籍应该是 Java 语言程序员的书架上必备的.书很贵,所以我有意将这份列表弄得很短,仅限于重要书籍. Thinking in Java (Bruce Eckel) Thinking in Java, 3rd edition (Bruce Eckel; Prentice Hall PTR,2002 年) Java 编程思想:第3版 (陈昊鹏 等译; 机械工业出版社,2005 年) Eckel 的书

《面向对象的思考过程(原书第4版)》一1.1 基本概念

本节书摘来自华章出版社<面向对象的思考过程(原书第4版)>一书中的第1章,第1.1节,[美] 马特·魏斯费尔德(Matt Weisfeld) 著 1.1 基本概念 本书主要目标是让你学会思考如何将面向对象概念应用于面向对象的系统设计中.历史上定义面向对象的语言拥有以下特点:封装(encapsulation).继承(inheritance)和多态(polymorphism).因此,如果设计一门语言时没有完全实现以上特性,那么通常我们认为该语言不是完全面向对象的.即使实现了这三点,我也往往会加入组

《面向对象的思考过程(原书第4版)》一3.5 多重继承

本节书摘来自华章出版社<面向对象的思考过程(原书第4版)>一书中的第3章,第3.5节,[美] 马特·魏斯费尔德(Matt Weisfeld) 著黄博文 译更多章节内容可以访问"华章计算机"公众号查看. 3.5 多重继承 第7章会讲述有关继承的更多细节.然而,这里很适合讨论多重继承.多重继承是类设计中最强大也最具挑战的一个方面. 顾名思义,多重继承允许一个类继承自多个类.实际看起来这是个好主意.对象都应该模拟现实世界,不是吗?现实世界中存在很多多重继承的例子.父母是多重继承的