华侨大学面向对象

2024-05-11

华侨大学面向对象(精选11篇)

篇1:华侨大学面向对象

《面向对象课程设计》教学大纲

课程编码: 030751003 周/学分: 1周/2学分

一、大纲使用说明

本大纲根据电子信息科学与技术专业2010版教学计划制订

(一)适用专业 电子信息科学与技术专业

(二)课程设计性质 必修课程、考查课程。

(三)主要先修课程和后续课程

1.先修课程:C语言程序设计,数据结构,面向对象程序设计C++ 2.后续课程:VC++程序设计、Java程序设计、高级UI程序设计、专业方向综合实训、毕业设计

二、课程设计目的及基本要求

本课程设计的目的在于巩固课堂所学知识点,加深对课程中所学理论知识的理解,进一步提高学生运用已学的知识分析问题和解决问题的能力,达到对学生进行素质教育的目的之一。

学生应当已经学习了面向对象程序设计这门课程,掌握了课程的各个知识点,具有一定的程序设计能力。

课程设计基本要求如下:

1.了解并掌握面向对象程序设计的主要原理与方法,具备独立分析和设计能力; 2.掌握软件开发过程的问题分析、系统设计、程序编码、测试等基本方法和技能; 3.提高综合运用所学的理论知识和方法独立分析和解决问题的能力。4.认真撰写设计报告,培养严谨的作风和科学的态度。

三、课程设计内容及安排

结合实际应用的要求布置课程设计题目,内容既要覆盖教学所要求的知识点,又要接近工程的实际需要。

课程设计安排如下:

教师布置若干设计任务,学生每人至少一题。要求学生完成课题的分析、算法的实现、程序设计、调试运行正确,给出正确的运行结果;每人于指定时间进行演示和答辩,最后每人要提交一份课程设计报告。

四、指导方式

1.理论指导:题目详细讲解其原理及实现方法的理论指导; 2.实验指导:编程语言和程序模块集成及程序调试方法的指导;

3.设计报告指导:主要内容包括目的意义、原理和实现方法简介、对课题实现过程的分析及说明、实验结果情况说明、结论。

五、课程设计考核方法及成绩评定

1.考核方法:上机测试及编写课程设计实验报告。

2.成绩评定:课程设计的上机测试结果占70%,实验报告成绩占30%。最终成绩分为:“优秀”、“良好”、“中等”、“及格”和“不及格”五级。鼓励学生在设计中有创新并对书中给出的设计有一定的改进或完善。

六、课程设计教材及主要参考资料

1.教材

《面向对象程序设计(C++语言)》,李爱华、程磊编,清华大学出版社 2.参考资料

《面向对象的程序设计语言——C++》,陈志泊 王春玲编,人民邮电出版社 《C++程序设计教程》,钱能编,清华大学出版社

《C++语言程序设计》,郑莉 董渊 张瑞丰 编,清华大学出版社

编写人:程磊 审核人:程磊 批准人:张焕君

篇2:华侨大学面向对象

电梯运行状态图

门的(有把手/无把手)装潢模式(模式+类图+代码)时钟(钟表/数字)同上

网页下载(http/ftp)的两种下载方式用什么模式实现 同上

篇3:华侨大学面向对象

面向对象分析与设计是现代软件企业广为采用的一项有效技术[5], 由于其较强的理论性与实践性, 历来是教学的难点。掌握面向对象分析与设计原理和技术对软件开发有着重要的指导作用。高校是承担软件人才培养的主要场所, 但长期以来, 一个不争的事实是, IT用人单位常常对刚进入工作岗位的毕业生不满意, 他们认为学生在学校里并没有为自己将来所从事的工作做好必要的准备, 而教育界也意识到存在的问题, 采取措施进行教学改革。面向对象分析与设计课程教学改革的一个主要方向是使课程的教学、实践等环节与现实软件开发中的情形更加相符。

一、面向对象分析与设计课程现状

面向对象分析与设计方法是目前软件开发的主流方法, 它是软件工程人才必须掌握的基础知识和必备的能力[6]。可以说OOAD是软件系统开发中最能体现从业人员创新思维以及其技术精髓闪光点之处[7], 而与这门课程在软件行业的重要性形成鲜明对比的是, 目前OOAD课程教学体系与模式已然落后。由于软件工程专业2008年开始建设, 该课程目前已完成08、09、10、11级软件工程专业, 10、11级电子商务专业讲授, 教学体系、师资队伍、教学资源亟须完善。理论讲授如何和项目实践相关联, 学生的学习兴趣和积极性如何提高等等, 教学改革迫在眉睫。

随着教学的不断深入, 通过对国内多个高校面向对象分析与设计课程设置和教学目标运行的调查, 结合社会对人才需求和该课程人才培养目标的分析, 发现课程存在如下问题:

1. 教学内容有待完善, 缺乏相对应的教学方法和手段。

教育教学内容的制定, 只针对了课程本身, 没有很好地注重学生解决实际问题的能力, 对面向应用的要求认识不足, 过多重视理论教学, 弱化了技术应用和实践能力培养, 缺少面向对象思维培养, 从而导致学生分析和设计能力提升较慢, 更多地停留在基础知识和基本的应用层面。

2. 教学资源匮乏。

多媒体辅助教学是一种非常有效的现代化教学手段, 是现代教学改革的方向之一[8], 由于课程开设时间较短, 课程教材、多媒体课件、参考资料不足, 建立配套的教学资源, 提供网络教学交流手段, 提供教学效果和教学水平方面开展的工作还不够, 不能很好满足教师备课、课程教学和学生学习的需要。

3. 实验教学环节有待完善, 缺乏设计性、综合性、应用性实验项目。

实验教学环节, 只针对章节所学内容进行实习, 而对综合应用、实际问题的解决缺乏有效的实验教学内容和教学环节。

4. 教学手段和方法较单一。

目前《面向对象分析与设计》课程仅仅完成了对相应的教学课件、教案、讲义的建设, 在教学方法、教学手段、网络教学平台上还需要进一步探索和研究。

5. 考核与评价方式单一, 缺乏整体考核体系。

目前采用单一考试成绩作为评价课程学习的主要依据。只注重知识考核, 缺乏教学过程考核, 应建立健全考试系统, 实现知识学习和能力培养相结合的考核方式, 使考核更加合理、公平、公正。因此, 我们积极进行新的教学体系和教学方法的改革。

二、面向对象分析与设计课程改革的探索

针对课程目前的实际情况, 进行面向对象分析与设计课程改革时, 既要照顾到课程基础理论, 又要照顾到分析与设计技术的新动向, 因此我们在以下方面进行改革。

1. 提高师资队伍水平, 建设结构合理的课程组。

师资队伍是课程建设的基础, 一流的师资才能保证有一流的课程, 按照多年在其他课程中的教学经验[9], 成立以课程负责人任组长, 长期从事该门课程教学的主讲教师为成员的课程小组, 课程小组成员必须具有职称梯队、学历梯队、专业及年龄结构合理的特点。同时课程小组负责研究课程的目标及课程体系, 制定教学大纲及教学计划, 设计教学方案及教学过程, 开展教学研讨, 监督教学质量和效果, 集中解决教学中出现的问题。课程小组成员针对课程情况, 不定期地外出考察, 参加教学研讨会, 或进高校、公司、企业进修, 了解国内外面向对象分析与设计课程的教学、应用的现状、学科发展动态及社会人才需求, 与时俱进地完善教学体系, 修订教学大纲。

2. 更新教学内容, 改善教学组织方法, 构建合理的教学、实验架构。

在教学组织和课程讲授过程中引用先进的教学理念, 利用网络技术、多媒体技术进行辅助教学, 提高教学质量和效果。不同的教学方法和教学手段在不同章节合理搭配, 扬长避短。教学组织方法如下: (1) 不断更新教学内容、完善教学过程、提高学生能力。课程组制定并规范了教学内容, 制作电子教案, 并及时进行更新。同时, 任课教师根据学生的实际情况课前做适当调整, 各教师间定期交流、相互听课、优势互补。 (2) 根据教学情况, 结合课程特点, 以案例为基础, 以实践为导向来组织教学。《面向对象分析与设计》是一门理论与实践并重的课程, Java语言程序设计、数据库原理与应用、软件工程、Web程序设计等课程是其先修课程。本课程对学生对项目的实践能力要求较高, 通常要求学生开课前要具备一定的项目开发经验, 这样学生在问题的理解和掌握上会更加准确。在近三年的授课过程中, 课程组还发现仅仅拥有项目开发的经验还不够, 如果能够跟进项目, 对项目进行不断的更新和升级对OOAD的理解起到更加重要的作用。因为在项目功能增加、系统逻辑变复杂的过程中, 学生很容易发现自己编写的程序存在的问题, 更加深刻地理解OOAD及其使用方法。但由于教学条件的限制, 大部分学生在本课程前并没有参与过项目的开发, 因此课程的教学方法显得尤为必要。教学过程中启发式教学、项目驱动教学、案例教学贯穿始终。启发式教学主要用在问题的提出部分, 或引出解决方法部分。如:什么样的表示方法易与不同领域的人员沟通, 引出UML;怎样表达对象的调用顺序, 引出顺序图等。

项目驱动教学法[10]是指在教学中引入若干个项目, 按照实际软件开发中的方法与步骤展开教学。课程组目前主要采用两个项目贯穿课程始终, 3~5个学生为一组, 该分组保持在教学的各个部分。首先进行系统设计编码, 在教学过程中根据课程进度, 进行面向对象的分析与设计, 实习过程中进行修改。一个是学生信息管理系统, 一个是综合教务管理系统。学生管理信息系统要求具有课程查询、课表查询 (分别按班级、教师、教室) 、选课、成绩查询等基本功能。学生对系统较熟悉, 因此对问题域的了解较清楚。这个项目实际上是使学生能够利用面向对象分析与设计的知识来解决熟悉领域的问题。综合教务管理系统在学生信息管理系统的基础上增加教师模块和管理员模块, 使管理员能够排课、查询课表 (同学生) , 教师模块能够提交成绩, 生成多种报表。该项目是在前一个项目的基础上完成的, 使学生能够在原有基础上进行系统更新和维护, 总结接口、类、属性、方法设计的缺点和漏洞, 体会和理解面向对象分析和设计方法的作用。

案例教学[11,12,13]是由美国哈佛法学院前院长Langdel于1870年首创, 后经哈佛企管研究所Doham进行推广, 并从美国迅速传播到世界许多地方, 被认为是代表未来教育方向的一种成功教育方法。20世纪80年代, 案例教学引入我国[14]。课程主要案例及分析过程中让学生通过分组讨论完成, 应用场景如下:面向对象分析部分采用降雨侵蚀力工具软件为案例, 该工具是利用“水量计”记录的降水数据, 进行统计分析, 获取次降雨次数、次降雨总量、次降雨历时、次降雨平均雨强、次降雨能量、最大30分钟雨强、降雨侵蚀力。该案例是学生没有接触过的专业领域, 对问题的理解需要通过与领域专家进行交流, 同时代码编写不多, 又能说明OOAD中的相关问题。基于该案例, 完成对问题域的分析, 绘制用例图、类图、顺序图、通信图、活动图、包图。最终将学生提交的分析模型进行课堂分享, 选取1组学生完成较好的进行讲解。源码及分析模型的参考供学生下载、讨论和学习。面向对象设计部分将前期分析作为设计的基础, 按学生所学先修课程及自身语言掌握情况, 将学生分为6组, 分别为C++、Java、C#、JSP、ASP.NET、PHP进行设计。根据该案例, 将采用C++编写的程序从问题域部分、人机交互部分、控制驱动部分、数据管理部分、构件与部署部分分别讲授面向对象设计的内容和相关方法。

3. 构建网络教学平台, 为学生提供丰富的学习空间。

搭建网络平台, 将教学课件、教案、实习作业、习题、优秀作品、源码等提供给学生参考。增加课程相关内容的辅助信息, 对课堂知识进行扩充, 为优秀学生提供更加广阔的平台, 同时学生亦可选择自己感兴趣的内容进行自我提高。提供可在线答疑的师生交流平台, 为学生关心的重点、难点问题进行讲解和说明。

4. 强化平时考核, 淡化期末考试, 增加课程后期实践教学环节。

学生的分析和设计能力是无法通过期末考试的一张试卷所反映出来的, 所以学生的平时考核尤为重要, 平时考核可以占到最终成绩的30%, 由作业、实习实验效果和项目讲解组成, 其中本课程的设计模式部分可由学生分组进行讲解, 然后老师点评、补充完成, 根据学生完成的效果给分。这种形式使学生对设计模式的理解更加深入, 能够理论联系实际。

为了巩固学生学习效果, 在大三暑期增加校企实训的实践课程, 课程将企业指导教师引入学校, 按照企业软件制作的标准过程, 对系统进行分析、设计和编码, 使学生能够将理论尽快地应用到实践中。目前已完成08、09级的实训, 学生对课程内容、课程在企业开发中的应用掌握得较好, 同时对授课方法也反映较好。

5. 编写符合教学要求和目标的实习指导书。

实习指导书是知识巩固的重要途径, 是促进教育教学改革与发展, 提高高等教育教学质量的重要方面。基于此, 编写合适的实习指导书, 将新的教学理念和教学思想、学科发展方向融入到教学中去成为了课程建设亟待解决的问题。《面向对象分析与设计》实习指导书经过3次修订, 于2012年9月投入使用, 目前效果良好。实习指导书主要包括Rational Rose的使用;绘制用例图、类图、顺序图、通信图、活动图、包图;研究生培养管理系统的分析和设计过程。

三、结语

经过3年的《面向对象的分析与设计》课程建设, 目前已经基本形成了合理的职称梯队、学历梯队、年龄梯队, 课程体系已经具有客观性、科学性和可操作性。考核体系完善, 能够激发作为学习主体的学生的学习积极性, 鼓励学生的个性发展, 培养学生的创新意识和创新能力, 为培养全面的专业人才打基础。网络教学平台提供了教学团队之间教学信息共享和交流, 为学生知识扩展、自学、互动提供了有效的技术支撑, 为教学实施提供了保障机制。在进一步的工作中, 我们按照精品课程的标准, 进一步完善课程的教学资源, 将教学视频、教学案例库组织完成, 完成更加全面的教学资源建设。

摘要:分析了当前高等院校面向对象分析与设计课程的教学现状及存在问题, 提出了该课程基于启发式、项目驱动式、案例式教学方法下课程大纲、教学内容的确定, 项目、案例的选取, 实习、实验的构建。在知识体系结构、教学方法、考核方式、教学资源建设等方面, 探讨了本门课程的教学改革思路。

篇4:面向对象的软件设计技术

关键词:面向对象;特征;软件分析;设计技术

中图分类号:TP319文献标识码:A文章编号:1007-9599 (2011) 06-0000-01

Object-oriented Software Design Technology

Shi Tong

(Shanghai East China Normal University,Shanghai200062,China)

Abstract:This paper introduces an object-oriented concepts and features,as well as object-oriented software development and design of the correlation analysis,explore the object-oriented software development technology,the main content,which includes object-oriented requirements analysis techniques,surface System design technology to the object,object-oriented programming techniques and object-oriented testing techniques.

Keywords:Object-oriented;Features;Software analysis;Design technology

一、引言

随着传统结构化方法的软件开发技术的弊端不断凸现,人们逐步转向了面向对象的软件开发技术,到上世纪90年代,面向对象技术是软件开发技术中核心的开心技术,虽然近年IT界已经提出了面向服务的软件开发技术,但由于其在软件业的应用不成熟性和一些局限性,和面向对象技术的相关优势,其仍然是当今软件开发与设计的核心技术之一。

二、面向对象

(一)面向对象

1.面向对象就是把现实世界中任何一种事物看作一种可以被认识的对象,并对其具有的相关属性和行为进行发现和研究。而面向对象技术的基本思想实现了从现实世界到计算机世界的映射,即现实问题空间到计算机的解空间,其中,问题空间到解空间为自然映射的抽象,解空间到问题空间为真实而完整的反映映射。

2.对象:是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,对象表示具体的事物和抽象的规则、计划或事件。

3.类和实例:具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,或者说,类的实例是对象,类实际上就是一种数据类型。类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。

4.消息和方法:对象之间进行通信的结构叫做消息。在对象的操作中,当一个消息发送给某个对象时,消息包含接收对象去执行某种操作的信息。类中操作的实现过程叫做方法,一个方法有方法名、参数、方法体。

(二)面向对象的特征

1.对象唯一性。每个对象都有自身唯一的标识,通过这种标识,可找到相应的对象。

2.抽象性。抽象性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。

3.继承性。继承性是子类可以自动共享父类的数据结构和方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。

三、面向对象的软件分析与设计

(一)面向对象的需求分析技术。按照软件工程角度来说,面向对象的需求分析是软件开发过程中的需求分析阶段,其主要是运用面向对象技术和面向对象的思想对问题空间进行思考,分析,研究等工作。面向对象的需求分析一般采用方法包括自顶向下和自底向上的方法进行系统建模。

(二)面向对象的系统设计技术。面向对象的系统设计技术阶段的主要任务就是计算机世界的解空间中的相关对象和对象之间的关系进行模型化,根据相互联系,将对象进行类型划分。具体来说,即根据需求分析的内容和相关说明,将需求分析阶段的工作进行形式化的说明和描述,达到功能规格说明,并进行层次地逐步地细化,直到细化到能用面向对象的程序语言设计和实现为止。系统设计阶段要围绕以数据为中心,程序设计与数据相结合的设计方法。

(三)面向对象的程序设计技术。面向对象的程序设计技术是面向对象的系统设计的后期工作,是对计算机世界的解空间进行具体地实现,其工作与具体的程序设计语言是不相关的,与解空间的实现策略是相关的。在确定策略后,实施程序设计的步骤,如图1所示。

(四)面向对象的测试技术。面向对象的测试技术就是采用面向对象的方法开发系统测试,与其他的测试没有本质的区别。系统测试的目的在于检测系统的正确性和稳定性,测试步骤是从局部测试开始,再到整体测试。局部测试是对系统中部分构件的综合测试,整体测试是对整个系统进行综合、全面和局部与局部之间的联系性、稳定性的检测。测试技术最主要的测试方法是“主攻型”的综合性测试,尤其在软件的开发期间,表现尤为重要。

四、总结

软件的质量与软件的开发技术与方法是密切相关的,人们针对软件质量的要求,提出了多种软件开发技术和方法,但都遇到了软件维护方面的多种问题,尤其在采用结构化的软件开发方法。面向对象的软件设计和方法提供了以往开发方法更好的解决办法,其以数据为软件的开发中心,结合用户需求和系统功能进行系统结构的建立和设计,最后形成软件的框架与结构。

参考文献:

[1]倪彬.面向对象的系统分析[J].软件世界,1995,96(2)

[2]陈余年,方美琪.面向对象软件工程[M].北京:清华大学出版社,1999,2

[3]张海藩.软件工程导论[M].北京:清华大学出版社,1998,1

篇5:华侨大学面向对象

面向对象(Object Oriented,OO)是当前计算机界关心的重点,它是90年代软件开发方法的主流,不过随着时代的发展,很多人对OO编程方法的看法也出现了一些变化;

最近在网上面看到有个名人喷面向对象的文章,我们可以先看一看:

“面向对象编程是一个极其糟糕的主意,只有硅谷里的人能干出这种事情。” — Edsger Dijkstra(图灵奖获得者)

“面向对象设计是用罗马数字做计算。” — Rob Pike(Go语言之父)

““面向对象”这个词包含很多意思。有一半是显而易见的,而另一半是错误的。“ — Paul Graham(美国互联网界如日中天的教父级人物)

“实现上的继承就跟过度使用goto语句一样,使程序拧巴和脆弱。结果就是,面向对象系统通常遭受复杂和缺乏复用的痛苦。” — John Ousterhout( Tcl and Tk 的创始人) Scripting, IEEE Computer, March

“90%的这些胡说八道都称现在它很流行,非要往我的代码里搓揉进面向对象的石粒。” — kfx

“有时,优雅的实现只需要一个函数。不是一个方法。不是一个类,不是一个框架。只是一个方法。” — John Carmack(id Software的创始人、第一人称射击游戏之父)

“面向对象编程语言的问题在于,它总是附带着所有它需要的隐含环境。你想要一个香蕉,但得到的却是一个大猩猩拿着香蕉,而其还有整个丛林。” — Joe Armstrong(Erlang语言发明人)

“我一度曾经迷恋上了面向对象编程。现在我发现自己更倾向于认为面向对象是一个阴谋,企图毁掉我们的编程乐趣。” — Eric Allman(sendmail的创造者)

——摘自:面向对象编程从骨子里就有问题

下面我们来分析一下他们为什么讨厌面向对象,过度追求OO到底有什么问题:

面向对象的生产效率

这是OO编程比较推崇的一点,不过我们可以先看看这篇文章:如此理解面向对象编程

在文章中,某“ ”,将下面一段代码,“面向对象”成了7个文件,代码量由原来的几行变成了几十行。

public class PrintOS

{

public static void main(final String[] args)

{

String sName = System.getProperty(“os.name”) ;

if (osName.equals(“SunOS”) || osName.equals(“Linux”))

{

System.out.println(“This is a UNIX box and therefore good.”) ;

}

else if (osName.equals(“Windows NT”) || osName.equals(“Windows 95”))

{

System.out.println(“This is a Windows box and therefore bad.”) ;

}

else

{

System.out.println(“This is not a box.”) ;

}

}

}

文中的这位“ ”将学院派的做法发挥到了极致,

虽然这只是一个OO的教学文档,但确实很像OO的一篇高级黑,但我们仍能看出一味地追求OO会增加多么大的代码量。你现在明白你为什么需要IDE来辅助了吧? 在茫茫多的文件中寻找一个变量是多么的不容易呀。

面向对象的性能

这篇文章详细地讨论了OO的性能:Pitfalls Of Object Oriented Programming.

文中指出,从1980年至今,CPU的性能提高了近10W倍,但内存的访问性能只提高了不足10倍,原因就是内存的访问相对速度大为降低,OO的滥用使程序要经过很多间接过程才能访问到目标内存地址,

因而过度使用面向对象,会严重影响性能, 作者推荐优化数据和代码结构为先,并尽量使用KISS(keep it simple, stupid)原则来设计软件。

面向对象的可维护性

面向对象从一开始就要求我们完全了解各个子类的不同,并将他们的“共性”提取到父类里,从而实现代码复用, 在这个过程中自然形成了一种最强的耦合关系。这种设计方法在需求非常确定的情况下是有效的,但在实际生活中我们发现需求总是在开发过程中不断提出的,而且也总在变化,甚至跟之前完全相反,当你看到你精心设计的框架成为你需求变更的障碍时,你做何感想?

在一个完全OO的系统中,我们会不自觉地使用设计模式驱动型编程,正如这种编程的名字所说的,这种编程风格使用大量的设计模式,在你的程序中,四处都是设计模式,你的代码到处都是Facade,Observer ,Strategy,Adapter,等等等等。于是,你的程序要处理的业务逻辑被这些设计模式打乱得无法阅读,最后,也不知道是业务需求重来,还是设计模式重要,总之,实际业务需求的程序逻辑被各种设计模式混乱得不堪入目。摘自:各种流行的编程风格

该如何面向对象

篇6:笔试题面向对象

1请解释下列10个shell命令的用途

top、ps、mv、find、df、cat、chmod、chgrp、grep、wc

2、写出下列服务的用途和默认端口

ftp、ssh、http、telnet、https

面向对象

1、写出php的public、protected、private三种访问控制模式的区别

2、写出下列程序的输出结果

class a{

protected $c;

public function

a(){

$this ->c=10;

}

}

class b extends a

{

public function print_data(){

篇7:面向对象编程的总结

OOP 达到了软件工程的三个主要目标:重用性、灵活性和扩展性。为了实现整体运算,每个对象都能够接收信息、处理数据和向其它对象发送信息。

面向对象有三大特性,分别是:封装、继承、多态。封装是隐藏对象的属性和实现细节,仅对外公开接口,控制在程序中属性的读和修改的访问级别;将抽象得到的数据和行为(或功能)相结合,形成一个有机的整体,也就是将数据与操作数据的源代码进行有机的结合,形成“类”,其中数据和函数都是类的成员。目的是增强安全性和简化编程,使用者不必了解具体的实现细节,而只是要通过外部接口,以特定的访问权限来使用类的成员。任何类都可以从另外一个类继承,即这个类拥有它所继承类的所有成员。被继承的类称为父类或基类。C# 只支持单继承,不支持多重继承,即在C# 中一次只允许继承一个类,不能同时继承多个类。在C# 中,接口允许多继承,可以通过继承多个接口来实现类似于C++中的多重继承。

多态是同一个类在不同场合下表现出不同的行为特征。

使用抽象方法与虚方法都可以实现多态性。抽象方法是一个未实现的方法,使用abstract关键字修饰,含有抽象方法的类必然是抽象类。抽象方法要在其子方法中通过override关键字重写。

篇8:面向过程和面向对象解析

结构化分析方法是从功能角度来看待系统的, 它展示了系统中端到端的处理过程, 所以它在需求分析中显得尤为重要。但从上例中我们也发现, 这种自上而下的功能分解, 意味着整体的采购过程将首先被分析, 分解出各子过程的依赖关系, 然后才是对订购子过程的分析。实际上, 分析过程往往不是这样, 通常同时需要各个不同层次上的系统信息, 较低层的模型可能先被描述, 然后经过抽象最后产生一个总模型。特别对一些大型的项目, 需求不明确, 结构复杂, 因果关系无法分辨清楚, 再把这种清晰的过程模拟出来实在是太困难了, 在这种情况下面向过程就不再适用。

在实际应用中, 以上的矛盾目前已经被解决, 同时也产生了很多新的方法论, 面向对象就是现在比较常用的方法论之一。

面向对象 (Object Oriented, 简称OO) 方法认为, 世界是由一个个独立的“对象”组成的, 一切皆对象, 每个对象都有自己的状态和动作。具有相似状态和动作的对象抽象出“类”, 而这些“对象”就是这个“类”的一个实例。繁杂的对象可以由简单的对象以某种方式组合而成, 不同的对象相互作用就形成了系统。

面向对象的四大特性就是抽象、继承、封装、多态。这也是区别于面向过程的主要方面。

1) 抽象:是指将具有一致的状态和行为的对象抽象成类。所以类就是一组具有相同属性和方法的对象的集合, 比如:小明这个人-对象, 人类-类。其中特殊的是抽象类, 它不能被实例化, 抽象方法只需声明, 而不需实现;

2) 继承:是子类自动共享父类属性和方法的一种机制, 是面向对象方法区别于其他方法的一个核心思想。继承性规范了类的等级结构, 实现了公共特性的共享, 提高了软件的重用性;

3) 封装:封装的目的是使对象的定义和实现分离, 减少耦合。对象之间只能通过接口进行信息交流, 对象外部不能对对象中的数据随意进行访问和修改;

4) 多态:指同一操作作用于不同对象时可以有不同的执行结果。

与结构化方法类似, 面向对象方法也包括面向对象分析 (OOA) 、面向对象设计 (OOD) 、面向对象的程序设计 (OOP) 三个阶段, 常用的辅助工具有UML、CASE工具等。

我们同样以一个例子来运用一下面向对象方法。例:对于一个图书管理系统来说, 它具有两类用户, 一类具有借阅权限, 而另一类只能在馆内阅读。

面向对象的一个任务就是找出其中的对象, 然后根据这些对象抽象出所具有的类和类与类之间的关系。对象分类就是描述对象类与对象类之间是如何通过共有属性和服务相互关联。在本例中, 只有阅读权限的用户是一类用户, 具有借阅权限的用户是另一类用户, 他们具有不同的权限, 但也可以抽象出他们都是用户, 他们都有用户名、地址、电话等共有属性, 具有注册和取销注册的动作, 所以在这两个类之上, 又可以抽象出一个用户类, 它是这两个类的父类, 具有这两个类的共有属性。这两个类继承用户类, 便具有了这些共有属性, 同时, 这两个类又可以增加自己各自的属性和方法。在某些需要下, 还可以对这两个分类再进行细分, 加入更多的不同的属性和方法形成下一级的子类, 这些子类同样继承于这两个类之一, 并间接继承于用户类, 具有其相应父类及父类的父类的属性和方法。

面向对象的思想更符合人类认识世界的过程, 人类认识世界是以客体为视角的, 客体的属性反应客体在某一时刻的状态, 客体的行为反映客体所能从事的活动。客体和客体之间没有直接的关系, 它们是通过某种刺激才发生连接。就像人类的个体, 人与人无直接的关系, 当一个人需要另一个人帮助时, 两个个体才发生关系。面向过程更加注重功能, 分化了个体, 背离了人们认识世界的方式。面向对象将属性和方法绑定在一起形成了相对稳定的个体, 如果需要改变也只是这个类对象个体的变化, 不会像面向过程一样, 牵一发而动全身, 一个变化就引起很多部分跟着变化, 这使得安全性及扩展性都得到了提高。再有就是重用性, 它是衡量一个软件产品成功与否的重要标志。面向过程的设计, 每个过程都是针对某个项目某个处理的特定过程, 它无法实现大力度的复用, 而面向对象的设计有高度的抽象, 它把功能的实现封装在组件的内部, 对外提供统一的接口, 只要调用这个组件时, 符合这些接口的要求, 就可以把该组件放在相似的项目中使用。基于以上的优势, 面向对象的分析方法越来越多的被人们使用, 成为现在分析和设计方法中的主流。

摘要:本文从软件分析、设计的角度, 讨论了面向过程和面向对象思想的特点及分析方法。面向过程和面向对象都是对软件分析、设计的一种认识思想, 它指导着人们以不同的方式去分析和设计软件。软件的分析和设计在软件的生命周期中是非常重要的, 它决定着将产生什么样的软件, 这会涉及到编程语言的选择、软件的结构、可扩展性等多个方面。本文结合实际的案例, 简要讨论了面向过程和面向对象的分析和设计方法, 其中也涉及到多种工具 (即DFD图, UML图) 的使用, 以说明不同的分析、设计思想的特点。

关键词:面向过程,自上而下,面向对象

参考文献

[1]圣安德鲁斯大学著.软件工程[M].8版.程成, 陈霞, 译.机械工业出版社.

[2]张友生著.系统分析师教程[M].清华大学出版社.

[3]面向对象.百度百科.http://baike.baidu.com/view/125370.htm.

篇9:浅谈面向对象编程思想

关键词:面向对象;继承;封装;多态

中图分类号:TP311.56文献标识码:A文章编号:1007-9599 (2011) 07-0000-01

Thought of Object-oriented Programming

Liu Jian,Sun Zheng,Hu Guoyu

(Nanjing University of Posts and Telecommunications,Nanjing210046,China)

Abstract:The class is an abstract thing with the same attribute,the object is a specific class of things,it has real property values.Object-oriented principle is the starting point and basic human habits as analog way of thinking,so it is easy to understand,logically,be accepted and recognized by the majority of IT practitioners.

Keywords:Object-oriented;Inheritance;Package;Polymorphism

说到面向对象就不得不提到面向过程。它出现在面向对象之前,是一种以过程为中心的编程思想。就是分析出解决问题所需要的步骤,然后采用分支循环用函数把这些步骤一步一步实现,使用的时候一个一个依次调用就可以了。首先必须承认面向过程可以解决所有的编程问题,但是也存在着重用性差、可维护性差、开发过程复杂等缺点。面向对象(Object Oriented,OO)是当前计算机界关心的重点,它是软件开发方法的主流。下文这种对面向对象的编程模式进行探讨。

一、首先介绍面向对象的基本概念

(一)对象。对象是人们要进行研究的任何事物,从最简单的整数到复杂的飞机等均可看作对象,它不仅能表示具体的事物,还能表示抽象的规则、计划或事件。

(二)对象的状态和行为。对象具有状态,一个对象用数据值来描述它的状态。对象还有操作,用于改变对象的状态,对象及其操作就是对象的行为。对象实现了数据和操作的结合,使数据和操作封装于对象的统一体中。

(三)类。具有相同特性(数据元素)和行为(功能)的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,也可以说类的实例是对象,类实际上就是一种数据类型。类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性。类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。

(四)消息和方法。对象之间进行通信的结构叫做消息。在对象的操作中,当一个消息发送给某个对象时,消息包含接收对象去执行某种操作的信息。发送一条消息至少要包括说明接受消息的对象名、发送给该对象的消息名(即对象名、方法名)。

二、其次看看面向对象的特点

(一)封装。封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

(二)继承。面向对象编程(OOP)语言的一个主要功能就是“继承”。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。继承概念的实现方式有三类:实现继承、接口继承和可视继承。

(三)多态。多态性(polymorphisn)是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作。简单的说,就是一句话:允许将子类类型的指针赋值给父类类型的指针。

实现多态,有二种方式,覆盖,重载。

覆盖,是指子类重新定义父类的虚函数的做法。

重载,是指允许存在多个同名函数,而这些函数的参数表不同(或许参数个数不同,或许参数类型不同,或许两者都不同)。

现在看看如何用面向对象的方法来解决这个问题。

建立学生实体类StudentTo其中包括如下属性

//姓名、年龄、性别、身高、学号

private String name;

private int age;

private String sex;

private String height;

private String studentID;

并提供get、set方法,有参、无参构造

在录入方法中实例化学生类对象为student,将姓名、年龄、性别、身高、学号等的属性值赋值给student,并将student传递给老师

StudentTo student=new StudentTo();

student.setName("李辉");

student.setAge(18);

student.setHeight("1.8m");

student.setSex("男");

student.setStudentID("NO.009");

老师接到传递过来的student后将学号改正后提交政教处保存

public void check(StudentTo student){

student.setStudentID("NO.010");}

政教处对学生接受到正确的学生对象后,可以从学生对象中取出姓名、年龄、性别、身高和学号备份留档。这样完整的面向对象解决问题的过程就结束了,从整个流程可以看到我们操作的一直是个实例化的对象,符合逻辑思维,减少了传递的参数,减小了出错的可能性,提升了编程的效率。

综上可以看出,面向对象操作符合人们思维习惯,它对类归纳总结,将类的成员放入对象中,大大减少了参数的传递和出错的可能。面向对象的继承、封装、多态特性也符合思维逻辑,在编程理解方面优势明显。随着时间的推移,近年来人们提出了更为先进的面向服务的概念,但是即使是面向服务也有大量面向对象的思想和影子。可以说面向对象思想直接影响了MVC编程模式,影响了人们的编程逻辑,对计算机语言的贡献无可替代。

参考文献:

[1]马光毅.面向对象方法研究[J].华南师范大学学报

篇10:华侨大学面向对象

Swift中类和对象的属性分为三种:储存属性,计算属性和类属性,

import Foundationclass Person { // 储存属性必须赋初值 var score1: Int = 20 var score2: Int = 50 // 延迟储存属性,需要时再去分配 lazy var dog: Dog = Dog() // 计算属性,不能赋初值,提供get和set方法, var sum: Int { get {return score1 + score2 } } // 类属性,只能是计算属性,使用类而非对象去调用 // 如 Person.desc class var desc: String { get {return This is one person. } } // 构造方法 init() { println(This is one person.) }}class Dog { init() { println(This is one dog.) }}var p = Person()println(Person.desc)println(p.score1)println(p.score2)println(p.sum)println(p.dog)

篇11:C#面向对象学习心得

这是一种隐藏信息的特性。拿本节引例来说,类CalculateDate 将数据结构与算法隐藏在类的内部,外界使用者无需知道具体技术实现细节即可使用此类。封装这一特性不仅大大提高了代码的易用性,而且还使得类的开发者可以方便地更换新的算法,这种变化不会影响使用类的外部代码。可以用以下公式展示类的封装特性:封装的类=数据+对此数据所进行的操作(即算法)。通俗地说,封装就是:包起外界不必需要知道的东西,只向外界展露可供展示的东西。在面向对象理论中,封装这个概念拥有更为宽广的含义。小到一个简单的数据结构,大到一个完整的软件子系统,静态的如某软件系统要收集数据信息项,动态的如某个工作处理流程,都可以封装到一个类中。具备这种“封装”的意识,是掌握面向对象分析与设计技巧的关键。

二、继承

继承是面向对象编程中一个非常重要的特性,它也是另一个重要特性——多态的基础。现实生活中的事物都归属于一定的类别。在一些书中,将父类称为超类(super class)。“继承”关系有时又称为“派生”关系,“B 继承自A”,可以说为“B 派生自A”,或反过来说,“A 派生出B”。父类与子类之间拥有以下两个基本特性:

(1)是一种(IS-A)关系:子类是父类的一种特例。

(2)扩充(Extends)关系:子类拥有父类所没有的功能。

1.类成员的访问权限

面向对象编程的一大特点就是可以控制类成员的可访问性。当前主流的面向对象语言都拥有以下三种基本的可访问性:

(1)公有 public 访问不受限制。

(2)私有 private 只有类自身成员可以访问。

(3)保护 protected 子类可以访问,其他类无法访问。

由此可见,可以通过子类对象访问其父类的所有公有成员,事实上,外界根本分不清楚对象的哪些公有成员来自父类,哪些公有成员来自子类自身。小结一下继承条件下的类成员访问权限:

(1)所有不必让外人知道的东西都是私有的。

(2)所有需要向外提供的服务都是公有的。

(3)所有的“祖传绝招”,“秘不外传”的都是保护的。

C#中还有一种可访问性,就是由关键字internal 所确定的“内部”访问性。internal 有点像public,外界类也可以直接访问声明为internal 的类或类的成员,但这只局限于同一个程序集内部。

读者可以简单地将程序集理解为一个独立的DLL 或EXE 文件。一个DLL 或EXE 文件中可以有多个类,如果某个类可被同一程序集中的类访问,但其他程序集中的类不能访问它,则称此类具有internal 访问性。internal 是C#的默认可访问性,这就是说,如果某个类没有任何可访问性关键字在它前面,则它就是internal 的。

2.子类父类变量的相互赋值

子类对象可以被当成基类对象使用。这是因为子类对象本就是一种(IS_A)父类对象,因此,以下代码是合法的:

Parent p;

Son c = new Son();

p = c;

然而,反过来就不可以,父类对象变量不可以直接赋值给子类变量。如果确信父类变量中所引用的对象的确是子类类型,则可以通过类型强制转换进行赋值,其语法格式为: 子类对象变量=(子类名称)基类对象变量;

子类对象变量=基类对象变量 as 子类名称;

3.方法重载、隐藏与虚方法调用

由于子类对象同时汇集了父类和子类的所有公共方法,而C#并未对子类和父类的方法名称进行过多限制,因此,一个问题出现了:如果子类中某个方法与父类方法的签名一样(即方法名和方法参数都一样),那当通过子类对象访问此方法时,访问的是子类还是父类所定义的方法?让我们先从子类方法与父类方法之间的关系说起。总的来说,子类方法与父类方法之间的关系可以概括为以下三种:

(1)扩充(Extend):子类方法,父类没有;

(2)重载(Overload):子类有父类的同名函数,但参数类型或数目不一样;

(3)完全相同:子类方法与父类方法从方法名称到参数类型完全一样。

当子类与父类拥有完全一样的方法时,称“子类隐藏了父类的同名方法,当分别位于父类和子类的两个方法完全一样时,调用哪个方法由对象变量的类型决定。“new”关键字明确告诉C#编译器,子类隐藏父类的同名方法,提供自己的新版本。如果子类隐藏了父类的同名方法,要在子类方法的实现代码中调用父类被隐藏的同名方法时要使用base 关键字。如果子类隐藏了父类的同名方法,不进行强制转换,就无法通过父类变量直接调用子类的同名方法,哪怕父类变量引用的是子类对象。这是不太合理的。我们希望每个对象都只干自己职责之内的事,即如果父类变量引用的是子类对象,则调用的就是子类定义的方法,而如果父类变量引用的就是父类对象,则调用的是父类定义的方法。这就是说,希望每个对象都“各人自扫门前雪,莫管他人瓦上霜”。为达到这个目的,可以在父类同名方法前加关键字virtual,表明这是一个虚方法,子类可以重写此方法:即在子类同名方法前加关键字override,表明对父类同名方法进行了重写。所以,将父类方法定义为虚方法,子类重写同名方法之后,通过父类变量调用此方法,到底是调用父类还是子类的,由父类变量引用的真实对象类型决定,而与父类变量无关!很明显,“虚方法调用”特性可以让我们写出非常灵活的代码,大大减少由于系统功能

扩充和改变所带来的大量代码修改工作量。由此给出结论:面向对象语言拥有的“虚方法调用”特性,使我们可以只用同样的一个语句,在运行时根据对象类型而执行不同的操作。

三、抽象

1.抽象类与抽象方法

在一个类前面加上“abstract”关键字,此类就成为了抽象类。对应地,一个方法类前面加上“abstract”关键字,此方法就成为了抽象方法。注意抽象方法不能有实现代码,在函数名后直接跟一个分号。抽象类专用于派生出子类,子类必须实现抽象类所声明的抽象方法,否则,子类仍是抽象类。抽象类一般用于表达一种比较抽象的事物,而抽象方法则说明此抽象类应该具有的某种性质,从同一抽象类中继承的子类拥有相同的方法(即抽象类所定义的抽象方法),但这些方法的具体代码每个类都可以不一样。抽象类不能创建对象,一般用

它来引用子类对象。一个抽象类中可以包含非抽象的方法和字段。因此:包含抽象方法的类一定是抽象类,但抽象类中的方法不一定是抽象方法。除了方法可以是抽象的之外,属性也可以是抽象的。

2.接口

接口可以看成是一种“纯”的抽象类,它的所有方法都是抽象方法。抽象类定义了对象所属的类别,而接口实际上定义了一种对象应具有的行为特性。某个类可以实现多个接口,当创建一个此类的对象之后,通过引用这个对象的对象变量可以访问其所有的公有方法(包括自身的公有方法以及由接口定义的公有方法以)。在这种情况下,根本分不清哪些方法是由接口定义的,哪些是由类自己定义的。C#提供了一种“显式接口”实现机制,可以区分开这两种情况。由此得到一个结论:如果一个类显式实现某个接口,则只能以此接口类型的变量为媒介调用此接口所定义的方法,而不允许通过类的对象变量直接调用。或者这样说:被显式实现的接口方法只能通过接口实例访问,而不能通过类实例直接访问。

四、多态

方法重载属于多态的一种,两个构成重载关系的函数必须满足几个条件:函数名相同、参数类型不同,或参数个数不同。具体调用哪个方法要看参数,需要注意的是,方法返回值类型的不同不是方法重载的判断条件。多态编程的基本原理是:使用基类或接口变量编程。在多态编程中,基类一般都是抽象基类,其中拥有一个或多个抽象方法,各个子类可以根据需要重写这些方法。或者使用接口,每个接口都规定了一个或多个抽象方法,实现接口的类根据需要实现这些方法。因此,多态的实现分为两大基本类别:继承多态和接口多态。

1.接口多态与继承多态

接口多态与继承多态其编程方式与作用都是类似的。但由于一个类可以实现多个接口,所以,接口多态较继承多态更灵活,因而在编程中也用得更广。多态是面向对象技术中最精华的部分之一。大量的精巧软件设计方案都建立在对多态特性的巧妙应用上。在编程中应用多态,可以将其简化为两句:应用继承实现对象的统一管理;应用接口定义对象的行为特性。对比传统的不使用多态的编程方式,使用多态的好处是:当要修改程序并扩充系统时,需要修改的地方较少,对其他部分代码的影响较小。

五、类与对象

类是面向对象编程的基本单元,与使用C语言等结构化编程语言不一样,使用C#编程,所有的程序代码几乎都放在类中,不存在独立于类之外的函数。一个类可以包含两种成员:静态成员和实例成员,静态成员是供类的所有对象所共享的,而实例成员只供某一个对象所有。实例成员与静态成员的访问规则:位于同一类中的实例方法可直接相互调用;类的字段(包括实例字段和静态字段)可以被同一类中的所有实例方法直接访问;类中的静态方法只能直接访问类静态字段。

类中包括:方法和字段,属性是一种特殊的字段,它可以保证数据的合法性,方法和字段这两个概念是面向对象理论的术语,是通用于各种面向对象语言的。字段(Field)代表了类中的数据,在类的所有方法之外定义一个变量即定义了一个字段。在变量之前可以加上public、private 和protected 表示字段的访问权限。方法(function)功能代码的集合,在程序开发过程中,经常发现多处需要实现或调用某一个公用功能,这些功能的实现都需要书

写若干行代码。如果在调用此功能的地方重复书写这些功能代码,将会使整个程序中代码大量重复,会增大开发工作量,增加代码维护的难度。为了解决代码重复的问题,绝大多数程序设计语言都将完成某一公用功能的多个语句组合在一起,起一个名字用于代表这些语句的全体,这样的代码块被称为“函数(function)”。引入“函数”概念之后,程序中凡需要调用此公用功能的地方都可以只写出函数名,此名字就代表了函数中所包含的所有代码,这样一来,就不再需要在多个地方重复书写这些功能代码。

对象是以类为模板创建出来的。类与对象之间是一对多的关系。在C#中,使用new 关键字创建对象。在程序中“活跃”的是对象而不是类。在面向对象领域,对象有时又被称为是“类的实例”,“对象”与“类的实例”这两个概念是等同的。

六、值类型与引用类型

1.值类型

值类型变量与引用类型变量的内存分配模型也不一样。每个正在运行的程序都对应着一个进程(process),在一个进程内部,可以有一个或多个线程(thread),每个线程都拥有一块“自留地”,称为“线程堆栈”,大小为1M,用于保存自身的一些数据,比如函数中定义的局部变量、函数调用时传送的参数值等,这部分内存区域的分配与回收不需要程序员干涉。所有值类型的变量都是在线程堆栈中分配的。值类型共有三种:简单类型、枚举类型和结构类型。

2.引用类型

另一块内存区域称为“堆(heap)”,在.NET 这种托管环境下,堆由CLR 进行管理,所以又称为“托管堆(managed heap)”。用new 关键字创建的类的对象时,分配给对象的内存单元就位于托管堆中。在程序中我们可以随意地使用new 关键字创建多个对象,因此,托管堆中的内存资源是可以动态申请并使用的,当然用完了必须归还。打个比方更易理解:托管堆相当于一个旅馆,其中的房间相当于托管堆中所拥有的内存单元。当程序员用new 方法创建对象时,相当于游客向旅馆预订房间,旅馆管理员会先看一下有没有合适的空房间,有的话,就可以将此房间提供给游客住宿。当游客旅途结束,要办理退房手续,房间又可以为其他旅客提供服务了。引用类型共有四种:类类型、接口类型、数组类型和委托类型。所有引用类型变量所引用的对象,其内存都是在托管堆中分配的。严格地说,我们常说的“对象变量”其实是类类型的引用变量。但在实际中人们经常将引用类型的变量简称为“对象变量”,用它来指代所有四种类型的引用变量。

七、命名空间与类库

1.命名空间

在使用面向对象技术开发的现代软件系统中,经常拥有数百甚至上千个类,为了方便地管理这些类,面向对象技术引入了“命名空间(namespace)”的概念。命名空间可以看成是类的“容器”,它可以包含多个类。.NET Framework 使用命名空间来管理所有的类。如果把类比喻成书的话,则命名空间类似于放书的书架,书放在书架上,类放在命名空间里。当我们去图书馆查找一本书时,需要指定这本书的编号,编号往往规定了书放在哪个书库的哪个书架上,通过逐渐缩小的范围:图书馆->书库->书架,最终可以在某个书架中找到这本书。类似地,可以采用图书馆保存图书类似的方法来管理类,通过逐渐缩小的范围:最大的命名空间->子命名空间->孙命名空间„„,最终找到一个类。

2.类库

为了提高软件开发的效率,人们在整个软件开发过程中大量应用了软件工程的模块化原则,将可以在多个项目中使用的代码封装为可重用的软件模块,其于这些可复用的软件模块,再开发新项目就成为“重用已有模块,再开发部分新模块,最后将新旧模块组装起来”的过程。整个软件开发过程类似于现代工业的生产流水线,生产线上的每个环节都由特定的人员负责,整个生产线上的工作人员既分工明确又相互合作,大大地提高了生产效率。在组件化开发大行其道的今天,人们通常将可以重用的软件模块称为“软件组件”。在全面向对象的.NET 软件平台之上,软件组件的表现形式为程序集(Assembly),可以通过在Visual Studio 中创建并编译一个类库项目得到一个程序集。在Visual Studio 的项目模板中,可以很方便地创建类库(Class Library)项目,Visual Studio 会自动在项目中添加一个名为Class1.cs 的类文件,程序员可在此类文件中书写代码,或者添加新的类。一个类库项目中可以容纳的类数目没有限制,但只有声明为public 的类可以被外界使用。类库项目编译之后,会生成一个动态链接库(DLL:Dynamic Link Library)文件。这就是可以被重用的.NET 软件组件——程序集。默认情况下,类库文件名就是项目名加上“.dll”后缀。每个类库项目都拥有一个默认的命名空间,可以通过类库项目的属性窗口来指定。需要仔细区分“类库项目”、“程序集”和“命名空间”这三个概念的区别:

(1)每个类库项目编译之后,将会生成一个程序集。

(2)类库项目中可以拥有多个类,这些类可属于不同的命名空间。

(3)不同的类库项目可以定义相同的命名空间。

根据上述三个特性,可以得到以下结论:“命名空间”是一个逻辑上的概念,它的物理载体是“程序集”,具体体现为“DLL”(或EXE)文件。在Visual Studio 中,可通过创建“类库”类型的项目生成程序集。一个程序集可以有多个命名空间,而一个命名空间也可以分布于多个程序集。一旦生成了一个程序集,在其他项目中就可以通过添加对这一程序集的引用而使用此程序集中的类。其方法是在“项目”菜单中选择“添加程序集”命令,激活“浏览”卡片,选择一个现有的程序集文件(DLL 或EXE)。一个项目添加完对特定程序集的引用之后,就可以直接创建此程序集中的类了,当然要注意指明其命名空间。

八、委托

委托是一种新的面向对象语言特性,在历史比较长的面向对象语言比如C++中并未出现过。微软公司在设计运行于.NET Framework平台之上的面向对象语言(如C#和VisualBasic.NET)时引入了这一新特性。委托(delegate)也可以看成是一种数据类型,可以用于定义变量。但它是一种特殊的数据类型,它所定义的变量能接收的数值只能是一个函数,更确切地说,委托类型的变量可以接收一个函数的地址,很类似于C++语言的函数指针。简单地说:委托变量可看成是一种类型安全的函数指针,它只能接收符合其要求的函数地址。委托可以看成是一个函数的“容器”,将某一具体的函数“装入”后,就可以把它当成函数一样使用。定义委托类型时对函数的要求被称为函数的“签名(signature)”。函数的签名规定了函数的参数数目和类型,以及函数的返回值,体现了函数的本质特征。每一个委托都确定了一个函数的签名。拥有不同签名的函数不能赋值给同一类型的委托变量。因此,一个委托类型的变量,可以引用任何一个满足其要求的函数。

1.委托的组合与分解

委托变量可以代表某一函数,使用委托变量就相当于调用一个函数。如果仅是这么简单,那么直接调用函数不就行了吗?为什么还要引入“委托”这一特性?事实上,委托不仅可以代表一个函数,还可以组合“一堆”的函数,然后批量执行它们,这样的委托变量又称为“多路委托变量”。可以用加法运算符来组合单个委托变量为多路委托变量。类似地,也可以使用减法运算符来从一个多路委托变量中移除某个委托变量。

2.事件与多路委托

事件的主要特点是一对多关联,即一个事件源,多个响应者。在具体技术上,.NET Framework 的事件处理机制是基于多路委托实现的。事件与多路委托其实大同小异,只不过多路委托允许在事件源对象之外激发事件罢了。所有的.NET Framework 可视化窗体控件的预定义事件,都是某一对应的“事件名+Handler”委托类型的变量。与此事件相关的信息都封装在“事件名+Args”类型的事件参数中,此事件参数有一个基类EventArgs,它是所有事件参数的基类。明了上述内部机理,对于我们在程序中定义自己的事件非常有好处,尤其是开发一个自定义的可视化控件时,如果需要增加新的事件类型,我们应尽量遵循.NET Framework 的定义事件的框架,给事件取一个名字,定义一个“事件名+Handler”的事件委托类型,再从EventArgs 派生出自定义事件的参数,取名为“事件名+Args”。

上一篇:周五问候祝福语下一篇:店长会议