主要有以下特点:
(1)从问题域中客观存在的事物出发来构造软件系统,用对象作为对这些事物的抽象表示,并以此作为系统的基本构成单位。
(2)事物的静态特征(即可能用一些数据来表达的特征)用对象的属性表示,事物的动态特征(即事物的行为)用对象的服务表示。
(3)对象的属性与服务结合为一体,成为一个独立的实体,对外屏蔽其内部细节,即封装。
(4)对事物进行分类。把具有相同属性和服务的对象归为一类,类是这些对象的抽象描述,每个对象是它的类的一个示例。
(5)通过在不同程度上运用抽象的原则,可以得到较一般的类和较特殊的类。特殊类继承一般类的属性与服务,面向对象方法支持对这种继承关系的描述与实现,从而简化系统的构造过程及其文档。
(6)复杂的对象可以用简单的对象作为其构成部分,称作聚合。
(7)对象之间通过消息进行通信,以实现对象之间的动态联系。
(8)通过关联表达对象之间的静态关系。
面向对象的编程语言(Object-oriented Programming Language)是专门为面向对象观念而发展出来的,通过它可以便捷地实现面向对象的封装、继承、多态等特性。
1.封装 封装是一种信息隐藏技术,即对象内部对用户是隐藏的,不可直接访问;用户只能见到对象封装界面上的信息,通过对象的外部接口访问对象。封装的目的在于将对象的使用者和对象的设计者分开,使用者无须知道对象内部实现的细节,只需要知道对象接收的消息即可。
当用户向对象发送消息后,对象将根据收到的消息来调用内部方法以做出响应。 在C++语言中,对象的构成由类来描述,每个类的成员可以分为私有和公有两种类型,对象的外部不能直接访问对象的私有部分。
对象的封装特性可以提高模块之间的独立性,使得系统易于调试和维护。 假设应用系统中有两个模块:一个模块从计算机的串行通讯口接收数据,放入缓冲区;另一个为数据处理模块。
数据处理模块可以直接访问缓冲区,从缓冲区中读取数据。此时这两个模块之间的关联程度密切,模块独立性很差。
如果接收数据的模块改变缓冲区的管理方法,则第二个模块必须做相应的改变。如果数据处理模块对缓冲区操作有误,将影响数据接收模块,在程序调试时难以确定错误发生在哪一个模块中。
实际上,数据处理模块并不需要缓冲区的管理信息,它只需要知道缓冲区中有没有数据以及有什么样的数据。上面的处理方法违反了软件工程中的信息隐藏原则,数据处理模块访问了它不需要的信息。
将数据接收模块封装为一个对象,缓冲区的管理信息作为其私有数据,即可避免上面的问题。数据接收模块只要提供一个从缓冲区获得数据的接口即可。
数据处理模块只能访问该接口,而不能直接操作缓冲区。此时两个模块之间的独立性提高,如需改变缓冲区的管理方法,只需修改数据接收模块,数据处理模块将不受任何影响,因为数据接收模块提供的外部接口没有改变。
2.继承 人们在对客观世界的事物进行描述时,经常采取分类的方法。类是有层次的,即某个大类的事物可能分为若干小类,而这些小类可能又分为若干个更小的类。
面向对象思想采纳了事物分类的层次思想,在描述类的时候,某些类之间具有结构和行为的共性。例如教师类与学生类,在结构方面均具有姓名、年龄、身高、体重等,在行为(或操作)方面均具有回答身高、回答体重等操作。
将这些共性抽取出来,形成一个单独的类--人,描述教师类和学生类中的共性。类(人)的结构特征和行为特征可以被多个相关的类共享,例如教师类和学生类继承了人的结构和行为特征。
在C++语言中,通过类的派生机制来实现类的继承,可以从一个类中派生出一个新的类,这个类称为派生类的基类或父类,派生出的新类称为基类的派生类或子类。派生类的对象具有基类对象的特征,同时又有其自身特有的特征。
一个教师类的对象与一个学生类的对象都具有人这个类所描述的特征,同时又具有教师类和学生类各自所特有的特征。 利用类之间的继承关系,可以简化类的描述。
在人这个类中描述教师类和学生类的共性,而在学生类和教师类中只需描述各自的个性。利用继承机制可以提高软件代码的可重用性。
在设计一个新类时,不必从头设计和编写全部的代码,可以通过从已有的具有类似特性的类中派生出一个类,继承原有类中的部分特性,再加上所需要的新特性。这一点与面向过程的设计语言中的过程或函数不同,在面向过程的设计语言中,要使用具有相似功能的过程或函数,必须修改源程序代码以使其适应新系统的功能需求,而类的派生机制无需原有类的源代码即可派生出新的类。
利用类及其继承性描述系统时,由于类之间的继承关系,可能会形成一种具有层次性的类结构。在使用类的层次结构描述系统时,某些类之间的层次关系可以有多种实现方案。
例如中学生类,既可以直接从人这个类派生出来,也可以从人这个类的派生类--学生类派生出来。 在设计类的层次结构时,应注意建立的类层次结构是否易于理解以及组织类结构的费用等方面的问题。
设计出来的类层次结构是否合理,往往取决于系统分析员的经验等因素。 3.多态性 多态性是面向对象系统的又一重要特性。
所谓多态,即一个名词可具有多种语义。在C++语言中,多态性主要表现在以下两个方面。
(1) 重载 在C++语言中,同一函数名以及运算符可以具有不同含义的多种实现版本,编译器将根据函数调用的参数形式决定调用哪一种实现版本。 (2) 虚函数 C++语言引入了虚函数机制,允许在不同类层次对象中应用函数成员的不同版本。
例如实现一个类Shape,然后从该类派生出画点的类Point、画圆的类Circle、画直线的类Line,每一种图形的画法均不同,但是它们都有几种共同的操作--显示图形、擦除图形、移动图形。移动图形的操作都是首先擦除图形,然后改变图形的位置基准点,再在新位置显示出图形。
在类Shape中实现移动图形的操作,每种图形的显示、擦除、改变基准点等操作在派生类中分别实现。若程序中使用某图形对象的移动操作,编译器采用动态联编的手段,在执行时根据该图形对象是哪一个类的实例,决定调用。
主要有以下特点:(1)从问题域中客观存在的事物出发来构造软件系统,用对象作为对这些事物的抽象表示,并以此作为系统的基本构成单位。
(2)事物的静态特征(即可能用一些数据来表达的特征)用对象的属性表示,事物的动态特征(即事物的行为)用对象的服务表示。(3)对象的属性与服务结合为一体,成为一个独立的实体,对外屏蔽其内部细节,即封装。
(4)对事物进行分类。把具有相同属性和服务的对象归为一类,类是这些对象的抽象描述,每个对象是它的类的一个示例。
(5)通过在不同程度上运用抽象的原则,可以得到较一般的类和较特殊的类。特殊类继承一般类的属性与服务,面向对象方法支持对这种继承关系的描述与实现,从而简化系统的构造过程及其文档。
(6)复杂的对象可以用简单的对象作为其构成部分,称作聚合。(7)对象之间通过消息进行通信,以实现对象之间的动态联系。
(8)通过关联表达对象之间的静态关系。
你是说面向对象编程(OOP)吗?面向对象编程有两(三?)大特征:封装、继承和多态。
对于Java来说:封装即不公开属性本身,而是公开对属性存取操作的方法(getter/setter),在方法中进行部分逻辑的判断保证属性的值合法(比如年龄必须为大于0的整数);继承可以实现类的重用;多态依赖于继承存在,在子类中重写自父类继承的方法实现对象不同时调用同样方法做出不同响应。之所以说是三大特征是将继承与多态拆开说,但是以我的理解我认为没有继承就没有多态。
面向对象把所有程序中出现的量都定义为类,一个合理的类定义中,其属性和方法都是必须的合理的,能够合理描述这个类型完成的任务。
现在让我们把所有这些属性方法分散开来,出现了什么!它变成了C程序的样子,我们无法分清楚多个相同name变量是用来描述什么的,我们需要维护一长串变量列表和函数列表。但是对象语言将一组属性和函数封装在一起,我们声明了一个人的对象便知道他有名字属性和吃饭动作。
我们仅需要维护少量的类型,类型的属性则在我们声明此类的时候明确理解了因此不需要额外的记忆。对象语言设计更加紧凑明了,代码意义更加明确。
VFP,也就是Visual FoxPro,是应用程序开发软件,主要用于开发数据管理与运算等方面的软件。
VFP通过对象的属性、事件和方法来处理对象。
属性定义对象的特征或某一方面的行为。
方法(Method)是对象能够执行的一个操作。在Visual FoxPro中,方法是与对象相关联的过程
(完成某种操作的处理代码),通常也称为方法程序,它紧密地和对象连接在一起。
事件(Event)是由对象识别的一个动作,可以编写相应的代码对此动作进行响应.事件可
以具有与之相关联的方法程序。
通常事件是由一个用户动作产生,如单击鼠标(Click)、移动鼠标(MouseMove)或按键(KeyPress)等,也可以由程序代码或系统产生,如计时器。在Visual FoxPro中,不同的
对象所能识别的事件虽然有所不同,但事件集合是固定的,用户不能创建新的事件。
面向对象开发方法的特点主要有一下三点:
1、可重用性
可重用性是面向对象软件开发的一个核心思路,事实上前面所介绍的面向对象程序设的四大特点,无一例外地,都或多或少地在围绕着可重用性这个核心并为之服务。
我们知道,应用软件是由模块组成的。可重用性就是指一个软件项目中所开发的模块,能够不仅限于在这个项目中使用,而是可以重复地使用在其他项目中,从而在多个不同的系统中发挥作用。
可重用模块必须是结构完整、逻辑严谨、功能明确的独立软件结构;其次,可重用模块必须具有良好的可移植性,可以使用在各种不同的软硬件环境和不同的程序框架里;最后,可重用模块应该具有与外界交互、通信的功能。
2、可扩展性
可扩展性是对现代应用软件提出的又一个重要要求,即要求应用软件能够很方便、容易地进行扩充和修改,
这种扩充和修改的范围不但涉及到软件的内容,也涉及到软件的形进和工作机制。现代应用软件的修改更新频率越来越快,究其原因,即有用户业务发展、更迭引起
的相应的软件内容的修改和扩充,也有因计算机技术本身发展造成的软件的升级换代,如现在呼声很迫切的把原客户机/服务器模式下的应用移植到因特网上的工
作,就是这样一种软件升级。
使用面向对象技术开发的应用程序,具有较好的可扩展性。
面向对象技术的可扩展性,首先体现在它特别适合于使用在快速原型的软件开发方法中。快速原型法是研究软件生命周期的研究人员提出的一种开发步骤,相对
于传统的瀑布式的开发方法,它在某些程度上来说更加灵活和实用。快速原型法的开发过程是这样的(参看图4.9),首先在了解了用户的需求之后,开发人员利
用开发工具先做一个系统的雏形,称为原型,这个原型尽管粗糙,但却应该是完整的、可工作的。开发人员带着这个原型征求用户的意见,再根据用户的改进意见在
第一个原型的基础上修改和进一步开发,形成第二个原型,再带着第二个原型去征求用户的意见……如此循环往复,不断地在已有工作的基础上修改、细化、完善,
直到把最初粗陋的雏形精雕细琢成最终的功能完整、结构严谨的应用系统。
3、可管理性
以往面向过程的开发方法是以过程或函数为基本单元来构建整个系统的,当开发项目的规模变大时,需要的过程和函数数量成倍增多,不利于管理和控制。而面向对象的开发方法采用内涵比过程和函数丰富、复杂得多的类作为构建系统的部件,使整个项目的组织更加合理、方便。
例如一个系统,如采用面向过程的开发方法来实现,可能需要3000个过程或函数,要管理好这3000个过程或函数,它们在系统各种可能状态下的行为,
它们之间错综复杂的关系,显然是一件非常麻烦的工作,也容易出现失误和遗漏。如果这个系统采用面向对象开发方法来实现,则可能仅用100个类,平均每个类
包含30个方法,就可以完成同样的功能。100相对于3000,大大降低了管理、控制的工作量,从开发效率和质量保证等各个方面,都有很大的优越性。
另外,面向对象开发方法中的类,把数据和基上的操作封装在一起,使得仅本类的有限个方法才可以操纵、改变这些数据。这样,仍以上面的例子为例,当出现
数据的错误时,只需要检查与该据相关的在同一个类中的30个方法即可,而在面向过程开发方法中处理相同的问题,则可能需要把所有的3000个过程或函数统
统检查一遍,两者在工作量、效率和难易程度方面的差别是不信而喻的。
声明:本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
蜀ICP备2020033479号-4 Copyright © 2016 学习鸟. 页面生成时间:2.626秒