这个问题我也想请教一下了,面向对象具体在程序中是怎么体现的?我是做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上)。而我看到一些东西说,用面向对象的思维就很好解决这个问题......
以下面的程序为例: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中也可以通过类调用 静态变量,不过 没有实际意义 )
http://healerkx.cnblogs.com/
里面面向对象的若干个章节。
个人的一些看法,
面向对象和面向过程不能说哪个好哪个坏,有些时候,即使是现在,我们还是经常会遇到需要用过程来解决问题的时候,这可能也是为什么即便java也保留了静态概念,给面向过程留了个口
可能面向对象更能体现更适应现今的生产开发需求,更适合现在越来越多的所谓的开发团队,更适合一个团队实现真正的分工,程序员之间传递的不再是几个简单的值,而是他们生产中需要的某个构件的程序上的抽象
楼主举例说结构体也可以,确实,但如果之后接触面向对象后可能会发现,一个纯粹的对象回避一个结构体来的更灵活多变,重要的是更能重现业务中事务的本身的特点
举个简单的例子,一个游戏中需要设计人物,不同的人物有他们的共性,但更多的不同,当玩家选择一个人,可能会让他左转右转,攻击,防守,也可能想改变他的肤色,发型,如果用过程的方法,程序的耦合先不说,单是构造这些人物可能也会很费周折
在我看来一个对象就是对一系列过程以及属性的封装,所以在重现事务本质上会比单纯的过程有优势,但不可否认有很多时候,只需要过程就能搞定的事情也没必要刻意的去追求面向对象,最主要的可能是切合实际
我经常听说的一句是:一个对象是一系列操作(FuncPtr)和属性的封装(Property)......不过那个blog很长,我还在看......To 18楼:其实问题就是怎么划分才比较好,有些时候我划分了模块(其实更多的是把某个新加属性增加到某个类还是其子类这样的问题),写具体的操作函数的时候,才发现耦合性特别强,有些接口根本不能通用化。而且,ls有些说法也很正确,很多时候要考虑到实际。毕竟工作是有deadline的,越是设计的通用化也越是难写也难于理解,但是如果设计的适当通用化/模块划分合理反而能节约时间和减少bug。
计算机把信息世界分为很多个部分,每一个部分需要有共同的特征。这就像共和国的宪法一样,制定了很多规范,定义了很多概念。这里的概念,计算机把它叫做类(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的帖子)