面向对象介绍(1)

//以前的文章,刚进入大三时写的,那时刚看模式的书,初生牛犊不怕

//虎,现在看草拟的章节,几乎不敢续写了

第一篇

    做人很累,做程序员(软件开发人员)更累。
    恰好,前面就有一个帖子,讲的是一个老程序员的心声,大家看看,就可体会我们这行的酸楚,工作强度,工作时间,何况还有个人问题---试问谁不想得到爱情的滋润呢?可多数成了撒哈拉的望雨树……而且,不比其他行,我们被迫追赶机器的速度,“程序员的经验”,简直就可当作一个新典故,程序员行业不敬老:)。
    然而,做人很有意思,做程序员(软件开发人员)更有意思。
    一旦想一想,计算机已如何深入了这个社会,一旦想一想,这个领域,是如何的丰富,即有大片开垦好的丛林,阵阵送来清爽的风,又有无际的荒原野莽,等着有志者、冒险家去发现,去创造,你就会明白,一个真正的程序员的人生将是多么的精彩。更何况,我还没有注意到,哪个方面可以如此自由,如此蔑视级别,如此推崇创新!
   
    我们都是未来的计算机开发、工作人员,无论如何,我们的生活和计算机再也分不开,我们将为它追赶着技术,追赶着发展机会,品味着它所带来的一切!就如今天,在中秋前夕,我想念着我的家人,我思念我喜欢的女孩(我也是望雨树:),但我还坐在电脑面前,谈计算机的技术,谈面向对象!
    有同学或许会说,你要谈面向对象,就谈它的概念嘛,谈它的发展嘛,你为什么一开始就说那么多不相关的东西呢?哦,不,一个真正的程序员,不是在真空中掌握技术,对于一个人,很多时候,你没有掌握那些技术,多是非智商因素。事情不是孤立的,我因为上面的想法深深扎入内心,所以我才会去追求着那美妙的一切,包括面向对象,所以我才会在这儿写帖子。
    在计算机系,你没有听到这些,或者,你的心中,没有闪现过这些问题吗?

    (1)我学了c,但现在oo很流行,我想学,可我应该从哪儿开始呢?大家说c++好,但还有人说java更有前途,又听说c#气势汹汹的也来了,另外还有vb,有delphi,有smalltalk等等,啊天那,我神经快要断了!我该如何办呢?
    (2)(气愤地)啊,vc太难了,我恨不得拿脚踹它踹踹踹……(小声地)vb有用吗?……
    (3)我学了c++,可以写些小程序,可我不知道什么可设计成类(class),或者,我觉得无论什么层次都可写成类:)。我感觉到了这一定有问题,毫无疑问良好的oo程序系统应该为类(class)作出好的划分!可我怎么看不到痕迹呢?
    (4)代码重用,良好架构,可我的类怎么一堆一堆呢?而且总是需要新类?难道oo承诺的都是骗人的?我快要疯了……
    (5)oo的影响有多大?我自己想学的是数据库,是操作系统,或者网络,我学oo将有多大的收益呢?
     ……

    我相信大多数的同学心中都曾闪现过这样的问题;我正是捕捉着心中这样的问题一步一步走过来的……今天,我把它们摘出来,放到我的序中,一方面,我后面的小节设置,和它们有非常大的关系,另一方面,我渴望大家放手,不放口:)讨论。
    我当然希望能部分的解决它们。不,此话说大了:),我只是试图说说我的理解---其中当然有许多我从书中学来的观点。如果说的不对的地方,当然是由我负责,我自己没有理解好,炒的菜不好吃,我要问自己的橱艺了,你放心,我不会去找种菜人去理论:)。


    下面是草拟的章节:

    1,序       
    提出问题,我为什么选择这份苦差使。并讲一个小故事:)。
    2,面向对象语言的分析
    分析面向对象的概念和技术,在计算机(高级)语言中,主要讲c++和c#,delphi也会涉及,java就看进度了。
    3,简单的面向对象程序设计
    如题。
    4,用面向对象的观点构造数据结构
    讲数据结构的封装。用详实的例子,小的如链表,大的如图的遍历动态演示、哈夫慢树B_树的设计。
    5,编译器运用面向对象进行的封装实践
    有同学不知道该如何深入学习编程,他不停的问,vc好,还是c++builder好?delphi
有前途吗?等等诸如此类的问题。此节试图谈论它们。
    6,面向对象的开发理念
    所有的高手,都要回到数学上来,回到开发理念上来。本节谈论面向对象的开发理念和windows编程有关的部分。
    7,再谈面向对象的开发理念
    谈论UML和设计模式。
    8,其他面向对象技术
    谈论诸如操作系统、数据库等领域面向对象的应用。

    总之呢,这对我是个非常大的挑战!这些帖子的内容,我将在课下整理,搜索以前写的例子,或许还要写些新的例子。因此,发帖子的时间,也许会间隔的有点长,请大家原谅---期间我会以一些数学知识做补偿的:)。我希望熟悉其中任何一节内容的同学,如果你愿意承担其书写任务,我将是非常高兴。我来做你的助手!真的,来吧……
    写到此,绪论似乎应该结束了。然而我心中还有一个非常有趣的问题,我想了很久,今天还是说出来了,呵呵,不要对号入坐:)。
    似乎有这样的事,同学们路上遇到了,就问,学什么呢?哦,学c++……
    学c++?有一个古老的故事:),你听说过吗?
    说是从前有三个程序员,他们非常的有意思,也非常肯学。下班回来,他们常坐在一个小酒馆里,聊天呀什么的。这日,他们遇到了一个共同的熟人。大家招呼落座,熟人发话:“各位好友近日在忙些什么呢?”
    第一个程序员眼睛一亮,脸上灿烂的笑。这些日子为了加薪,他自学了c++。好在他有c的基础,不几日便把c++搞定了。c++?面向对象?那个简单,就是往struct{/*---*/}里扔函数,然后加public,加private,加protect,就是封装……于是他得意的说:“我学会了c++!”
    第二个程序员眼睛一亮,脸上也灿烂的笑。原来,他也自学了c++。不仅学了c++,他还看了传闻最难的vc!再忙活两个星期另两天另两个小时后,他终于在一大堆文件中完成了一个控件的应用,其中似乎弄了许多消息……不敢说十分明白,但又好象明白了,不就是好比家里老婆掌握着财政大权,我想用什么,就得给她打个电话……哦明白了,他成就感非常!于是也得意的说:“我也学会了c++”。
    第三个程序员也眼睛一亮,脸上灿烂的笑。毫无疑问,他也学了c++。学c++很长时间,有喜也有乐。vc难学啊,但进去其乐无比。更有趣的是,他现在老是想自己写的那些类,类创建了自己的对象,对象之间相互作用,有分布的感觉,也有抽象代数中关系与系统的特点,到底是巧合呢,还是这些知识真的有联系,有用?我要好好考察考察……刚想致此,却见其他人在盯着自己,于是浅浅一笑,也说:“巧了,我也在学c++……”。
    熟人大笑,哈哈,哈哈,可见是英雄所见略同!!
    这就是三个程序员的故事。是我前些日子专门为此系列杜撰的:),大家莫笑。就算作此绪论的结尾,好与坏,大家评论了。

     我开始准备第一节内容,可能花些时间。大家发自己的帖子接应我啊:)。

第二篇


                 一,引言

    这是这个系列的第二篇文章,本来很仓促,但看到计算机系的“水”这么大,也不得不抓紧时间:)。呵呵,微软前些日子又有Cg(在vc版看到的),有同学大呼c#还没学,微软要把我们拖疯了……哎呀呀,你们比微软还狠些,在我看来……:)
   
    玩笑玩笑,但对于微软,我们也不必如此慌张,我不主张“学语言**”的说法,上次的三个程序员的故事,并不是我想讽刺谁,实在是我觉得学计算机语言,其实是你要学它带来的思考方式,学它带来的技术,学习(练习)交流的方式……我接触面向对象,是在大一的时候,比接触c还早些。那时候,只有计算机文化基础的知识,懂点dos和windows95。记得寒假前我去找当时的一个大师兄(四年级),我说想看pascal,如何?事实上pascal我已看了点,只觉得这语言和数学太象了:),他说pascal没前途,最好是打好基础,大二后学c++和vc,大三和老师合作……恰好寒假在老师那儿住,见了钱能那本c++教程,
就看。
    开学后学校学c,自己就看着c++。如果你那时问我,什么是面向对象?面向对象有什么好处?为什么业内面向对象这么流行?我说不清楚,但我觉得,c++要比c好用些,比如:

    我在c中,需要一个一般求和的函数,可能你得写:

    int Add_int( int a,int b){ return a+b;}
    float Add_float( float a,float b){return a+b;}
    double Add_double(double a,double b){ return a+b;}

    在调用时我们自己要记得(!)区别对待。但c++中函数可重载:

    int Add(int a,int b) { return a+b;}
    float Add( float a,float b){ return a+b;}
    double Add(double a,double b){ return a+b;}

    调用时,我们自然不需在特意记得这个差别。似乎,在后来,差别更大些,c语言中,我们学了struct后,也许会觉得这个东东功能太强大了---大得不得了:),什么物体我们不可以拿到我们的程序中来,通过结构体?
    比如,邻居家有只猫儿,可爱的很,我们就有:

    struct Cat
   {
    int age;
    float weight;
    char color[20];
    char name[20];
    };
   
    好啦,邻居家的mimi,和自个养的tiantian,都可以在计算机里按个户口了:):


    ...
    struct Cat NCat;
        /* NCat.age=2;NCat.weight=5.5;NCat.color="black";NCat.name="mimi";*/

    struct Cat MCat;
       /*MCat.age=1;MCat.weight=4.5;MCat.color="yellow";MCat.name="tiantian";*
/
    ...

    这下,上面的求和函数可以用了,你的弟弟才上小学,想计算两个猫儿的年龄和、体重和,你说,这么做了,在上面的定义和初始化后,调用函数:
  
    int ageSum=Add_int(NCat.age,MCat.age);
    float weightSum=Add_float(NCat.weight,MCat.weight);

    你说,这很自然呀,我定义了我的数据,我初始化它们,然后我定义一大批功能函数,我在合适的地方调用它们处理我的数据,最后我得到我的结果,这有什么不妥吗?
    可以说没有,这是面向过程的编程模式,是我们大部分同学所熟悉的,它有它很多的优点。我们后来学数据结构,及现在学图形编程,大家都是这个思路。也没觉得特别不方便啊。
    然而,你从来没有想过,猫儿除了自身的属性值外,它还有很多自己的行为!你没有想过,猫儿寂寞的时候想唱唱歌?它或许在交朋友,自然得要对方的年龄呀,身高体重呀……和自己的比一比,看看是否合适?:)若如此,你太不理解你的猫儿,也太不了解这个世界的美妙了。
    可是,如何办呢?是呀,挺为难的,你有没有想到三个程序员的故事的第一个?那位的扔很有道理:):

    ...
    // c++ code
    struct Cat{
    int age;
    float weight;
    char color[20];
    char name[20];
  
    // Cat(int Age=0,float Weight=0;char Color[20]="none",
    //      char Name[20]="none")
    // { /*---*/}
    int Add(int a,int b){ return a+b;}
    float Add(float a,float b){ return a+b;}
    double Add(double a,double b){ return a+b;}
   
    void IntroduceSelf()
    {
       cout<<"My name is "<<name<<"."<<endl;
     }
     //and so on
    ...
    };

    看着是不是有点怪?呵呵,我看着也别扭,把struct改为class或许会好些,好在我现在只是试图在叙述我们从面向过程转向面向的动机,中间过程反而有利于说明问题。下面会有个纯c++的版本。
   
    这样,若NCat,MCat经定义后(注意初始化工作是有构造函数完成的,不过我暂时注释掉了),它们自己就可以来求伙伴俩的年龄和、体重和了,还可以自我介绍一下:
   
    MCat.IntroduceSelf();

    这个例子很小,不足以说明普及面向对象的必要性与紧迫性,但可给人些感性认识。事实上,我们的现实世界,是丰富多采的,我们的软件开发领域,是丰富多采的。我下面试图再完整的讲述这个例子。

    宠物也不是一种啊,终于有一天,你家人一致通过,再买一只小狗。现在你要在计算机上也给它按个户口,没办法,你是地大计算机系毕业的嘛,家里就你是专家:)!
    如何办呢,你是不是准备再写个struct dog{/*------*/};呢?呵呵,狗与猫有些共
同的属性,是不是觉得写起来很烦?然而猫狗的行为却大相径庭,于是你又要写一批函数管理狗的数据。
    这还好,不就是加只狗吗?可你一旦坐下来,一想起老爸退休了,要买只鸟,弟弟前日里哭着要养小乌龟,家里正为此开会表决:),而今天阿姨过来,送了几只可爱的金鱼……啊天啊,以后的日子该如何是好呢?

    呵呵,我们的程序员,事实上就面临着这样的困难。软件越做越大,软件要升级,软件要满足新的客户要求……我们的面向对象,可以说是应时而生!现在面向对象的概念,可以说以深入软件设计领域的各个方面,比如windows组件设计,比如数据库,我们如何能无动于衷呢?如何不去掌握它的思想呢?

    不说了,看一下c++如何对付那只狗的:):

    家里的猫和狗--------------------------------》都是宠物
    --猫的属性---行为--|
                       -------------------------》宠物的属性和行为
    --狗的属性---行为--|
    
    ...
    //C++ code

    class Pet
   {
   protected:
     int age;
     float weight;
     char color[20];
     char name[20];
   public:
     Pet(int Age,float Weight)
        :age(Age),weight(Weight)
        {   }
 
     virtural int GetAge()=0;
     virtural float GetWeight()=0;
     //and so on :)
 
     };

    class Cat:public Pet
    {
       float sleepHour;
       //and so on:)
     public:
       Cat(int Age,float Weight)
          :Pet(Age,Weight)
       {   }
   
     int GetAge() { return age;}
     float GetWeight(){ return weight;}
     //and so on:)
    };
   
    class Dog:public Pet
    {
       float runV;
       //and so on:)
      public:
        Dog(int Age,float Weight)
          :Pet(Age,Weight)
       {   }

     int GetAge() { return age;}
     float GetWeight(){ return weight;}
     //and so on:)
    };

    ...
   
    哈哈,我们终于引来了面向对象!让我休息一下,下次就此例详细说明面向对象的概念。因为时间问题,下次再举例,会有c#,delphi,但没有java了,呵呵,它们对面向对象的实现,本来就很相似嘛!

    附:我很想看大家写的帖子呢……

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值