这个问题我也想请教一下了,面向对象具体在程序中是怎么体现的?我是做C的MMI,就我现在的理解,面向对象是一种思想,不完全纠结于语言,就像目前我接触的一个平台:Typedef struct A{
...
};Typedef struct B{
A
...
};
这是一种简单的结构体间的继承关系。还有
Handler_B()
{
......
//B's special handler
.....Handler_A();
}
这是一种简单的处理函数的继承关系。
还有Func_tbl函数表的的简单继承/MapTbl的表驱动这些就不说了。
这些用C也可以实现。但我不知道为什么要叫面向对象?或者说,比如以不同界面来划分来程序模块?这就叫面向对象的划分吗?
那以变量来记录状态,以mode方式进行划分呢?以状态机的方式进行驱动呢?
说实话,我google也搜索了一些东西,但是还是没搞清楚......面向对象在具体的程序结构/设计思想上到底是指什么?可能这个问题对于达人来说有些幼稚,但我希望能说得实际点,太抽象了我理解不能.......我问这个是因为我目前发现了一个瓶颈,我写那些稍微复杂一点点的功能,比如说几千行的程序就可能debug的时候发现改得很麻烦,总结的时候发现是设计时候考虑不周(设计时候如果不多花点时间,就一定会多花时间在debug上)。而我看到一些东西说,用面向对象的思维就很好解决这个问题......

解决方案 »

  1.   

    OO思想需要慢慢培养的,没用过一两年OO语言,是永远也不会理解OO思想的精妙的
      

  2.   

    面向对象是个编程的思想,需要通过自己多学习和慢慢实践来建立,think in java中说“万物皆对象”,但到底怎么将一个大家都在说的思想转化为自己的编程思想,这个的确需要一点时间!
      

  3.   

    顶一下,我至少给了一点伪代码,所以请不要来太虚的东西,要是概念,我去看UML说明文档就了解的够多了,很多都看了的似乎和我目前的程序中有所对应,但是不够明确做法。我需要的是外延,或者例子......
      

  4.   

    1.这是类的例子,
    以下面的程序为例:Car是一个类,Truck是一个类,Truck继承Car类.Truck将继承Car类的所有属性
    当我们要调用Truck中的变量(如)时,需要创建一个Truck类的对象,通过Truck对象来调用Car的变量.
    Class Car{//车辆
       public String wheel;//汽车轮数:无轮,三轮,四轮,六轮    
    }
    Class Truck extends Car{//卡车
        private String num_ID;//汽车车牌
        private int type;//汽车类别 卡车\轿车\bus
        private String name;//生产厂家
        private Date date;//出场日期
        private String color;//汽车颜色
        public void setNum_ID(String id){
           num_ID=id;
       }
       public String getNum_ID(){
           return num_ID;
       }
    }
    public Class Test{
        public static void main(String args[]){
        Truck t=new Truck();
        t.setNum_ID("吉-12580");
        System.out.println(t.getNum_ID());
    }
    2
    再举个对象的例子: 你,我,他都在一个类(人类)中,而 你,我,他 这些就是 人类的对象(也叫 实例),我想知道 你的身高\年龄,怎么办呢?
    我 (对象已创建,没对象怎么调用,难道通过 人类来调用?) 问 你 (对象已创建) 来知道 你的身高!
    这个过程就是 对象间 调用 变量.因此,  人类 是   类
           你  是   对象
           他  是   对象
           我  是   对象
           我 通过 你 知道 你的 属性.
    或者   我 通过 他 知道 你的 属性.(他 可能 知道,也可能 不知道)
    而不能 人类 想要知道 你的 属性 吧.(Java中也可以通过类调用 静态变量,不过 没有实际意义 ) 
      

  5.   

    谢谢9楼的,不过这和我举的例子差不多,是以数据结构的形式实现继承,如果说某种数据结构的定义是类,那么此种数据结构的一个实际变量则为一个对象......看来,非c的语言也是如此处理的吗?我其实想知道的是,面向对象的设计,在设计一个较大的功能模块的时候,是怎么入手的?至今为止我只知道两种方法,1、按不同界面来划分小模块(mmi) 2、按不同状态(mode)来划分小模块即状态机( Status Machine)......
      

  6.   

    面向对象的实现差不多就是结构体里包含一些函数指针.目的是方便,封装好一个对象后,用这个对象来代表具体的业务.比原来的过程式语言要方便不少.比如定义个类:声卡,我想要使用声卡,就很方便, 我想构造一个 PCI的AC97声卡,然后想听歌,就调用声卡的唱歌方法,想发出噪音就调用声的噪音方法, 想让声卡关闭,就使用关闭方法.这不是完全的我们的正常思维么?
      

  7.   

    嗯,我的理解就是常常统一的一种思想,一切皆对象嘛,而类是对象的封装。记得有位高人说过,在他眼里从来没有什么JAVA代码,就是一个一个的对象。这个,在开发过程中,接触时间长了,就自然会体会到
      

  8.   

    唔,11楼的这种做法我也遇到过不少,其实就是RegisterCllBack的形式吧.......不过,关键其实在于,如何划分、定义基础的模块,基础的模块定义得好,通用性才好......然后基于模块来编程,才会不会越编越乱.......
      

  9.   

    我建议你先看完我的blog,
    http://healerkx.cnblogs.com/
    里面面向对象的若干个章节。
      

  10.   

    恐怕楼主很难在此得到一个让你满意的答案,
    个人的一些看法,
    面向对象和面向过程不能说哪个好哪个坏,有些时候,即使是现在,我们还是经常会遇到需要用过程来解决问题的时候,这可能也是为什么即便java也保留了静态概念,给面向过程留了个口
    可能面向对象更能体现更适应现今的生产开发需求,更适合现在越来越多的所谓的开发团队,更适合一个团队实现真正的分工,程序员之间传递的不再是几个简单的值,而是他们生产中需要的某个构件的程序上的抽象
    楼主举例说结构体也可以,确实,但如果之后接触面向对象后可能会发现,一个纯粹的对象回避一个结构体来的更灵活多变,重要的是更能重现业务中事务的本身的特点
    举个简单的例子,一个游戏中需要设计人物,不同的人物有他们的共性,但更多的不同,当玩家选择一个人,可能会让他左转右转,攻击,防守,也可能想改变他的肤色,发型,如果用过程的方法,程序的耦合先不说,单是构造这些人物可能也会很费周折
    在我看来一个对象就是对一系列过程以及属性的封装,所以在重现事务本质上会比单纯的过程有优势,但不可否认有很多时候,只需要过程就能搞定的事情也没必要刻意的去追求面向对象,最主要的可能是切合实际
      

  11.   

    感谢17楼/23楼的朋友,还有其它各位的意见:
    我经常听说的一句是:一个对象是一系列操作(FuncPtr)和属性的封装(Property)......不过那个blog很长,我还在看......To 18楼:其实问题就是怎么划分才比较好,有些时候我划分了模块(其实更多的是把某个新加属性增加到某个类还是其子类这样的问题),写具体的操作函数的时候,才发现耦合性特别强,有些接口根本不能通用化。而且,ls有些说法也很正确,很多时候要考虑到实际。毕竟工作是有deadline的,越是设计的通用化也越是难写也难于理解,但是如果设计的适当通用化/模块划分合理反而能节约时间和减少bug。
      

  12.   

    面向对象是计算机认识世界的一种方式,面对于花花绿绿的世界,计算机是怎样认识这个世界呢?人类为了描述这个世界,在数学上有一种重要的数学模式,分类别。计算机是人类发明的,自然也采用这样的一种模式。这就是面向对象。。
       
      计算机把信息世界分为很多个部分,每一个部分需要有共同的特征。这就像共和国的宪法一样,制定了很多规范,定义了很多概念。这里的概念,计算机把它叫做类(class)。  每一个概念都有其静态和动态的部分。例如:人的概念,静态的有年龄(int),姓名(String),性别(bool)。等等等等;动态的有,吃饭(吃什么,在那里吃,吃的好吗),上班(干什么,怎么去,先做什么,后作什么,今天发奖金吗,今年提职吗)等等等等。。  这就是类的概念。静态的我们叫做属性,动态的我们叫做方法。即一个类包含2方面的因素:静态的成员变量(属性)和动态的成员函数(方法)。程序代码如下class Person//class类的标识 抽象的,现实中不存的,仅为一个概念
    {  
    public://以后在讲述
      //成员变量
      int Age;
      bool Sex;
      char Name[10];
      //成员函数
      void Work(int type)
      {
      if(type<22)
      printf("我是一名学生,正在学习\n");
      if(type>22)
      printf("我是一名工人,为时会主义而努力奋斗\n");
      }
      void Eat(bool type)
      {
      if(type==false)
      printf("建议吃减肥健美之食物\n");
      if(type==true)
      printf("建议吃健身增寿之食物\n");
      }
    };  概念是抽象的,并不是现实生活中一个个活生生的实例,计算机要描述世界,需要这样的实例,在计算机的概念里,把实例叫做对象。这就是面向对象的第一大思想,类与对象。void main()//主函数
    {
      Person me;//对象 现实生活中的事务,实际存在的
      me.Age=18;
      me.Sex=false;
      me.Name[0]='A';me.Name[1]='l';me.Name[2]='i';me.Name[3]='c';me.Name[4]='e';
      Person you;//对象 现实生活中的事务,实际存在的
      you.Age=30;
      you.Sex=true;
      you.Name[0]='B';you.Name[1]='o';you.Name[2]='b';
    }  对象调用方法:
      me.Work(me.Age);me.Eat(me.Sex);//对象调用方法
      printf("\n");
      you.Work(you.Age);you.Eat(you.Sex);
       
      输出结果:
      我是一名学生,正在学习
      建议吃减肥健美之食物  我是一名工人,为时会主义而努力奋斗
      建议吃健身增寿之食物
     
      完整程序代码
    class Person//class类的标识 抽象的,现实中不存的,仅为一个概念
    {
    public://以后在讲述
      //成员变量
      int Age;
      bool Sex;
      char Name[10];
      //成员函数
      void Work(int type)
      {
      if(type<22)
      printf("我是一名学生,正在学习\n");
      if(type>22)
      printf("我是一名工人,为时会主义而努力奋斗\n");
      }
      void Eat(bool type)
      {
      if(type==false)
      printf("建议吃减肥健美之食物\n");
      if(type==true)
      printf("建议吃健身增寿之食物\n");
      }
    };void main()//主函数
    {
      Person me;//对象 现实生活中的事务,实际存在的
      me.Age=18;
      me.Sex=false;
      me.Name[0]='A';me.Name[1]='l';me.Name[2]='i';me.Name[3]='c';me.Name[4]='e';
      Person you;//对象 现实生活中的事务,实际存在的
      you.Age=30;
      you.Sex=true;
      you.Name[0]='B';you.Name[1]='o';you.Name[2]='b';  me.Work(me.Age);me.Eat(me.Sex);//对象调用方法
      printf("\n");
      you.Work(you.Age);you.Eat(you.Sex);
    }当对象代表了现实生活中的实例之后,程序也就完成了描述信息的使命,纵观整个面向对象编程,程序员整天描述的问题也就是这些东西,书写一个类,声明一些对象,然后调用方法。OK,你明白了吗。  总结:这就是神秘的类与对象概念,面向对象的第一大思想。本文还提出了成员变量,成员函数的概念。关于面向对象的其它思想,且听下回分解。
    (本回复转载至beijing1303的帖子)