首页 > 编程笔记
面向对象到底是什么
面向对象技术源于面向对象的编程语言(Object-Oriented Programming Language,OOPL)。从 20 世纪 60 年代提出面向对象的概念到现在,它已经发展成为一种比较成熟的编程技术,并且逐步成为目前软件开发领域的主流技术。
面向对象(Object-Oriented,OO)是一种设计思想,现在这种思想已经不单应用在软件设计上,数据库设计、计算机辅助设计(CAD)、网络结构设计、人工智能算法设计等领域都开始应用这种思想。
另外,对象也可以是一个抽象的事物,例如,可以从圆形、正方形、三角形等图形抽象出一个简单图形,简单图形就是一个对象,它有自己的属性和行为,图形中边的条数是它的属性,图形的面积也是它的属性,输出图形的面积就是它的行为。
概括地讲,面向对象技术是一种从组织结构上模拟客观世界的方法。
对象主要由两个部分组成,即静态部分与动态部分。静态部分,顾名思义就是不能动的部分,这个部分被称为“属性”,任何对象都具备其自身属性,如一个人有高矮、胖瘦、性别、年龄等属性;而具有这些属性的人执行的动作,如哭泣、微笑、说话、行走等,是人所具备的行为,也就是动态部分。
现实世界中的对象具有以下特征:
综上所述,现实世界中的对象可以表示为“属性+行为”,其示意图如下。
![](/uploads/allimg/240424/2-240424102539348.gif)
图 1 对象示意图
在计算机世界中,面向对象程序设计的思想要以对象来思考问题,首先要将现实世界的实体抽象为对象,然后考虑这个对象具备的属性和行为。
例如,现在面临一只大雁要从北方飞往南方这样的一个实际问题,尝试以面向对象的思想来解决这一实际问题,步骤如下:
1) 从这一问题中抽象出对象,这里抽象出的对象为大雁。
2) 识别这个对象的属性。对象具备的属性都是静态属性,如大雁有一对翅膀、一双脚等,这些属性如下图所示。
![](/uploads/allimg/240424/2-240424102603K0.gif)
图 2 大雁具备的属性
3) 识别这个对象的动态行为,即这只大雁可以进行的动作,如飞行、觅食等,这些行为都是这个对象基于其属性而具有的动作,如下图所示。
![](/uploads/allimg/240424/2-240424102615929.gif)
图 3 大雁具有的行为
4) 识别出这个对象的属性和行为后,这个对象就被定义完成,然后可以根据这只大雁具有的特性制订这只大雁要从北方飞向南方的具体方案以解决问题。
实质上,所有的大雁都具有以上的属性和行为,因此可以将这些属性和行为封装起来以描述大雁这类动物。
由此可见,类实质上就是封装对象属性和行为的载体,而对象则是类抽象出来的一个实例,它们之间的关系如下图所示。
![](/uploads/allimg/240424/2-24042410262VX.gif)
图 4 大雁类和对象
例如,汽车就可以看作一个类,而具体的某一款车就可以看作对象,如下图所示。
![](/uploads/allimg/240424/2-2404241026452F.gif)
图 5 汽车类及对象示意图
因此,我们说类是封装对象的属性和行为的载体,而具有相同属性和行为的一类实体被称为类。
图 5 中的汽车就是一个类,具体的保时捷汽车就是一个对象,而产地、车体颜色这些都是每一款车的静态部分,我们称之为属性,也就是图 5 中深色的部分;行驶、刹车(术语为制动)等是汽车可以执行的动作,我们称之为行为,也就是图 5 中浅色的部分,这类行为在程序设计中通过方法来体现。
面向对象的基本思想如下:
例如,在使用计算机时,只需要使用手指敲击键盘即可,而无须知道计算机内部的构造原理,如下图所示。
![](/uploads/allimg/240424/2-240424102H0211.gif)
图 6 使用计算机
采用封装的好处是保证了类内部数据结构的完整性,使用该类的用户不能直接看到类中的数据结构,也无须知道类中的具体细节,而只需要执行类允许公开的数据,这样就避免了外部对内部数据的影响,提高了程序的可维护性。
面向对象程序设计采用封装具有两方面含义,分别如下。
以平行四边形为例,如果把平行四边形看作四边形的延伸,那么平行四边形就复用了四边形的属性和行为,同时添加了平行四边形特有的属性和行为,如平行四边形的对边平行且相等。
在 C# 中,可以把平行四边形类看作继承四边形类后产生的类,其中,类似于平行四边形的类称为子类,类似于四边形的类称为父类或基类。
值得注意的是,在描述平行四边形和四边形的关系时,可以说平行四边形是特殊的四边形,但不能说四边形是平行四边形。同理,在 C# 中可以说子类的对象都是父类的对象,但不能说父类的对象是子类的对象。
四边形类层次结构示意图如下图所示。
![](/uploads/allimg/240424/2-240424102J4O0.gif)
图 7 四边形类层次结构示意图
从图 7 中可以看出,继承关系可以使用树形关系来表示,父类与子类存在一种层次关系。如果一个类处于继承体系中,那么它既可以是其他类的父类,也可以是其他类的子类。
如果类之间具有继承关系,则它们之间具有以下特性。
继承性是面向对象程序设计语言不同于其他语言的最重要的特点,是其他语言所没有的。采用继承性,可以避免公用代码的重复开发,避免代码和数据冗余,而且能够通过增强一致性来减少模块间的接口和界面。
例如创建一个螺丝类,螺丝类有两个属性:粗细和螺纹密度。然后再创建两个类,一个是长螺丝类,另一个短螺丝类,并且它们都继承了螺丝类。这样长螺丝类和短螺丝类不仅具有相同的特征(粗细相同,且螺纹密度也相同),还具有不同的特征(一个长,一个短,长的可以用来固定大型支架,短的可以用于固定家具)。
综上所述,一个螺丝类衍生出不同的子类,子类继承父类特征的同时,也具备了自己的特征,并且能够实现不同的效果,这就是多态化的结构。
螺丝类层次结构示意图如下图所示。
![](/uploads/allimg/240424/2-240424102P9645.gif)
图 8 螺丝类层次结构示意图
多态的意义在于同一操作作用于不同的对象时,可以有不同的解释,从而产生不同的执行结果,即“以父类的身份出现,以自己的方式工作”。在C#中,多态可以通过接口、抽象类、重载、重写等方式实现。
一个大的实现过程还可以分成各个模块,各个模块可以按功能进行划分,然后组合在一起实现特定的功能,如下图所示。
![](/uploads/allimg/240424/2-240424102RI13.gif)
图 9 面向过程编程
在面向过程编程中,程序模块可以是一个函数,也可以是整个源文件。
面向过程编程与面向对象编程相比较,在重用性、可维护性和稳定性等方面都比较差:
软件重用性是软件工程追求的目标之一。由于处理不同的过程都有不同的结构,因此当过程改变时,结构也需要改变,前期开发的代码无法得到充分的再利用。
面向对象(Object-Oriented,OO)是一种设计思想,现在这种思想已经不单应用在软件设计上,数据库设计、计算机辅助设计(CAD)、网络结构设计、人工智能算法设计等领域都开始应用这种思想。
认识面向对象
面向对象中的对象(Object)通常是指客观世界中存在的对象。这个对象具有唯一性,对象之间各不相同,各有各的特点,每一个对象都有自己的运动规律和内部状态;对象与对象之间又可以相互联系、相互作用。另外,对象也可以是一个抽象的事物,例如,可以从圆形、正方形、三角形等图形抽象出一个简单图形,简单图形就是一个对象,它有自己的属性和行为,图形中边的条数是它的属性,图形的面积也是它的属性,输出图形的面积就是它的行为。
概括地讲,面向对象技术是一种从组织结构上模拟客观世界的方法。
1、对象
现实世界中,随处可见的事物都是对象。对象是事物存在的实体,如人类、书桌、计算机、高楼大厦等,而不仅仅是“伴侣”。对象主要由两个部分组成,即静态部分与动态部分。静态部分,顾名思义就是不能动的部分,这个部分被称为“属性”,任何对象都具备其自身属性,如一个人有高矮、胖瘦、性别、年龄等属性;而具有这些属性的人执行的动作,如哭泣、微笑、说话、行走等,是人所具备的行为,也就是动态部分。
现实世界中的对象具有以下特征:
- 每一个对象必须有一个名字,以区别于其他对象;
- 可以用属性来描述对象的某些特征;
- 有一组操作,每一个操作决定对象的一种行为;
- 对象的操作可以分为两类:一类是自身所承受的操作,另一类是施加于其他对象的操作。
综上所述,现实世界中的对象可以表示为“属性+行为”,其示意图如下。
![](/uploads/allimg/240424/2-240424102539348.gif)
图 1 对象示意图
在计算机世界中,面向对象程序设计的思想要以对象来思考问题,首先要将现实世界的实体抽象为对象,然后考虑这个对象具备的属性和行为。
例如,现在面临一只大雁要从北方飞往南方这样的一个实际问题,尝试以面向对象的思想来解决这一实际问题,步骤如下:
1) 从这一问题中抽象出对象,这里抽象出的对象为大雁。
2) 识别这个对象的属性。对象具备的属性都是静态属性,如大雁有一对翅膀、一双脚等,这些属性如下图所示。
![](/uploads/allimg/240424/2-240424102603K0.gif)
图 2 大雁具备的属性
3) 识别这个对象的动态行为,即这只大雁可以进行的动作,如飞行、觅食等,这些行为都是这个对象基于其属性而具有的动作,如下图所示。
![](/uploads/allimg/240424/2-240424102615929.gif)
图 3 大雁具有的行为
4) 识别出这个对象的属性和行为后,这个对象就被定义完成,然后可以根据这只大雁具有的特性制订这只大雁要从北方飞向南方的具体方案以解决问题。
实质上,所有的大雁都具有以上的属性和行为,因此可以将这些属性和行为封装起来以描述大雁这类动物。
由此可见,类实质上就是封装对象属性和行为的载体,而对象则是类抽象出来的一个实例,它们之间的关系如下图所示。
![](/uploads/allimg/240424/2-24042410262VX.gif)
图 4 大雁类和对象
2、类
类就是同一类事物的统称。如果将现实世界中的一个事物抽象成对象,类就是这类对象的统称。例如,汽车就可以看作一个类,而具体的某一款车就可以看作对象,如下图所示。
![](/uploads/allimg/240424/2-2404241026452F.gif)
图 5 汽车类及对象示意图
因此,我们说类是封装对象的属性和行为的载体,而具有相同属性和行为的一类实体被称为类。
图 5 中的汽车就是一个类,具体的保时捷汽车就是一个对象,而产地、车体颜色这些都是每一款车的静态部分,我们称之为属性,也就是图 5 中深色的部分;行驶、刹车(术语为制动)等是汽车可以执行的动作,我们称之为行为,也就是图 5 中浅色的部分,这类行为在程序设计中通过方法来体现。
3、面向对象技术的基本思想
如果说传统的面向过程编程是符合机器运行指令的流程的话,那么面向对象的思维方法就符合现实生活中人类解决问题的思维过程。在把人类解决问题的思维方式逐步翻译成程序能够理解的思维方式的过程中,软件也就逐步被设计好了。面向对象的基本思想如下:
现实世界->由具体对象抽象出类->面向对象建模(类、对象、方法)->用程序实现->执行求解
4、面向对象程序设计的特点
面向对象程序设计具有三大基本特点:封装、继承和多态,下面分别描述。1) 封装
封装是面向对象编程的核心思想,将对象的属性和行为封装起来就是类。例如,在使用计算机时,只需要使用手指敲击键盘即可,而无须知道计算机内部的构造原理,如下图所示。
![](/uploads/allimg/240424/2-240424102H0211.gif)
图 6 使用计算机
采用封装的好处是保证了类内部数据结构的完整性,使用该类的用户不能直接看到类中的数据结构,也无须知道类中的具体细节,而只需要执行类允许公开的数据,这样就避免了外部对内部数据的影响,提高了程序的可维护性。
面向对象程序设计采用封装具有两方面含义,分别如下。
- 将有关的数据和操作代码封装在一个类中,各个类之间相对独立、互不干扰。
- 将类中的某些数据与操作代码对外隐蔽,即隐蔽实现其内部细节,只留下少量接口,以便与外部联系,接收外部的消息。
2) 继承
继承主要是利用特定对象之间的共有属性,例如,矩形、菱形、平行四边形和梯形等都是四边形,因为四边形与它们具有共同的特征:拥有 4 条边。只要将四边形适当地延伸,就会得到上述图形。以平行四边形为例,如果把平行四边形看作四边形的延伸,那么平行四边形就复用了四边形的属性和行为,同时添加了平行四边形特有的属性和行为,如平行四边形的对边平行且相等。
在 C# 中,可以把平行四边形类看作继承四边形类后产生的类,其中,类似于平行四边形的类称为子类,类似于四边形的类称为父类或基类。
值得注意的是,在描述平行四边形和四边形的关系时,可以说平行四边形是特殊的四边形,但不能说四边形是平行四边形。同理,在 C# 中可以说子类的对象都是父类的对象,但不能说父类的对象是子类的对象。
四边形类层次结构示意图如下图所示。
![](/uploads/allimg/240424/2-240424102J4O0.gif)
图 7 四边形类层次结构示意图
从图 7 中可以看出,继承关系可以使用树形关系来表示,父类与子类存在一种层次关系。如果一个类处于继承体系中,那么它既可以是其他类的父类,也可以是其他类的子类。
如果类之间具有继承关系,则它们之间具有以下特性。
- 类之间具有共享特性(包括属性和行为的共享);
- 类之间具有差别或新增部分(包括非共享的数据和程序代码);
- 类之间具有层次结构。
继承性是面向对象程序设计语言不同于其他语言的最重要的特点,是其他语言所没有的。采用继承性,可以避免公用代码的重复开发,避免代码和数据冗余,而且能够通过增强一致性来减少模块间的接口和界面。
3) 多态
将父类对象应用于子类的特征就是多态。例如创建一个螺丝类,螺丝类有两个属性:粗细和螺纹密度。然后再创建两个类,一个是长螺丝类,另一个短螺丝类,并且它们都继承了螺丝类。这样长螺丝类和短螺丝类不仅具有相同的特征(粗细相同,且螺纹密度也相同),还具有不同的特征(一个长,一个短,长的可以用来固定大型支架,短的可以用于固定家具)。
综上所述,一个螺丝类衍生出不同的子类,子类继承父类特征的同时,也具备了自己的特征,并且能够实现不同的效果,这就是多态化的结构。
螺丝类层次结构示意图如下图所示。
![](/uploads/allimg/240424/2-240424102P9645.gif)
图 8 螺丝类层次结构示意图
多态的意义在于同一操作作用于不同的对象时,可以有不同的解释,从而产生不同的执行结果,即“以父类的身份出现,以自己的方式工作”。在C#中,多态可以通过接口、抽象类、重载、重写等方式实现。
了解面向过程编程
面向过程编程的主要思想是先做什么、后做什么,在一个过程中实现特定功能。一个大的实现过程还可以分成各个模块,各个模块可以按功能进行划分,然后组合在一起实现特定的功能,如下图所示。
![](/uploads/allimg/240424/2-240424102RI13.gif)
图 9 面向过程编程
在面向过程编程中,程序模块可以是一个函数,也可以是整个源文件。
面向过程编程与面向对象编程相比较,在重用性、可维护性和稳定性等方面都比较差:
1、重用性差
重用性是指同一事物不经修改或稍加修改就可多次重复使用的性质。软件重用性是软件工程追求的目标之一。由于处理不同的过程都有不同的结构,因此当过程改变时,结构也需要改变,前期开发的代码无法得到充分的再利用。