面向对象编程实验总结

2024-05-05

面向对象编程实验总结(通用8篇)

面向对象编程实验总结 篇1

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

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

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

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

面向对象编程实验总结 篇2

关键词:Net,OpenGL,编程型游戏,实验软件

1 问题的提出

传统的面向对象实验教学处于理论课程的从属地位。实验内容较为基础, 多为一些演示、验证型实验, 实验结果一般采用打印输出的方式。对于学生而言, 抽象、繁琐的设计算法更是难以掌握, 也很少在实验课程中进行实际应用, 在一定程度上降低了学生实验的积极性。学生将较多的时间花费在理论课程的学习当中, 而忽视了实验技术的练习和积累。因此针对上述问题, 本文提出将编程型游戏融入到面向对象实验教学当中, 利用3D游戏丰富的表现形式和竞争元素, 激发学生实验的兴趣;通过让学生编写游戏逻辑程序, 提高学生的实践和创新能力。

2 背景分析

2.1 编程型游戏背景。

教育游戏[3]正成为国内外游戏与教育界研究的热点, 作为学生获取知识的一种手段和一种工具, 通过生动有趣、直观的表达方式来认识抽象复杂的东西, 精美的画面和交互性能力激发学生学习的兴趣。编程型游戏作为一类特殊的教育游戏, 打破了传统游戏将键盘、鼠标或手柄作为游戏逻辑的控制, 由游戏玩家通过编写游戏逻辑控制脚本, 自行设计游戏的逻辑控制。玩家不仅仅作为游戏的执行者去玩游戏, 同时还作为一个游戏开发者, 可以在不了解游戏开发过程的前提下, 避开了未知领域的相关技术, 很容易的参与到游戏开发当中去。既在游戏中获得了快乐, 又通过开发游戏获得了满足和成就感, 也是对程序设计技能和实践经验的一次积累。当今已经存在的编程型游戏包括robocode、AI-TANK、AI-RCJ[4]等。特别是AI-RCJ, 作为一款以“智能足球”为主题、以虚拟足球机器人为控制对象进行程序设计和比赛的游戏, 已经参与到了全国中小学网上虚拟机器人足球竞赛和“全国中小学信息技术与实践创新活动”智能机器人—虚拟足球机器人竞赛等项目中, 具有重要的现实意义。

2.2 技术背景。

2.2.1 Net平台。

Microsoft.NET框架是Microsoft公司推出的新一代软件开发平台, 其核心包括公共语言运行时 (CLR) 、.NET框架类库 (FCL) 及编程语言。CLR是.NET框架的基础, 提供内存管理、线程管理和远程处理等核心服务, 并且强制实施严格的类型安全以及可提高安全性和可靠性的其他形式的代码准确性。

2.2.2 Open GL三维图形开发类库。

Open GL是图形硬件的一种软件接口。从本质上说, 它是一个3D图形和模型库, 具有高度的可移植性, 并且具有非常快的渲染速度。Open GL并不是一种编程语言, 而是更像一个C运行时函数库。它提供了一些预包装的功能, 帮助开发人员编写功能强大的三维图形应用程序。如今, Open GL广泛流行于游戏、医学影像、地理信息、气象模拟等领域, 是高性能图形和交互性场景处理的工业标准。

3 实验软件设计

3.1 特点分析。

编程型面向对象游戏实验软件是将游戏作为实验内容, 致力于提高学生的实验兴趣和实践创新能力的培养, 因此它应具有的功能特点如下:1) 可扩展性。编程型面向对象游戏实验软件应具有良好的扩展能力, 提供可扩展的接口, 可以让教师添加新的游戏实验内容, 这包括游戏实验的规则、要求和游戏元素等。2) 竞争性。实验软件提供人人对战模式和排行榜机制, 学生间可以通过实验软件进行各自游戏逻辑算法的比拼, 更新自己在排行榜中的位置。通过学生间的竞争、比赛和交流, 吸引学生参与到实验当中去, 使学生自发的修改和完善自己的游戏逻辑程序。3) 即插即用。由于游戏实验的定制和游戏逻辑程序都独立于实验软件平台, 而为了满足游戏加载效率和对战模型的要求, 实验软件实现了类似于“插头—插座”式的即插即用功能, 使游戏实验和游戏逻辑程序可以动态加载到软件平台中。

3.2 设计与核心实现。

如图1包含了本实验软件的全部设计信息, 整个软件的开发都是根据该构架图进行的。从图中可以清晰的看出业务构件和系统构件分别封装了各自领域模型的业务逻辑, 在.Net框架之上, 由实验软件控制器进行集成, 最终实现了编程型面向对象游戏实验软件。其中系统构件主要包括配置服务和反馈机制等, 业务构件包括利用Open GL类库定制的游戏实验构件和学生编写的游戏逻辑构件组成。以下为实验软件的核心实现分析:

3.2.1 配置服务的实现。

配置服务主要包括系统环境的配置及游戏实验的临时文件配置, 主要针对XML文件进行操作。为了便于扩展和业务逻辑变更时客户端代码改动达到最小, 利用抽象工厂模式思想, 采用统一的接口Experience Factory为客户端代码提供服务。

3.2.2 游戏实验的定制。

Game Logic类是学生编写的游戏逻辑, 它实现了游戏实验提供的游戏逻辑接口, 通过动态加载C++程序集的方式, 将其加载到游戏实验中;Game类是游戏呈现类, 可以作为一个独立的游戏进行显示;Game Experience类通过实现平台的游戏实验接口, 对Game Minority类进行了接口适配, 将游戏实验加载到平台中。Data Service类是数据服务。具体设计如下:为了扩展新的游戏实验, 满足构件间“插头—插座”式的即插即用功能, 软件平台采用.Net程序集技术实现了构件间的动态加载。首先学生端将实现的游戏逻辑类在程序集调用入口中进行实例化。

3.2.3 实验软件平台实现。

实验软件的平台利用MFC进行搭建, 通过Game Choice类选择游戏实验的内容, Main Frame类完成了对实验的控制, 包括游戏的基本控制、游戏实验的管理、编译文件和游戏对战等。Open Experiment View类进行了对Open GL环境的配置工作, 并且加载游戏实验的DLL, 显示游戏内容。

3.3 难点分析。

3.3.1 崩溃检测。

由于实验软件采用学生实验程序以源文件形式提交, 首先由软件本身对源程序进行编译, 生成动态链接库, 然后进行游戏逻辑的正确性验证操作。这样就可能会出现程序编译通过, 但执行操作时由于各种原因导致的程序崩溃的情况, 因此需要对验证程序进行崩溃检测。其解决方法是要求验证程序在刚开始执行时建立一个临时文件, 如果程序未出现崩溃性错误, 顺利完成验证工作, 则在程序关闭时自动删除临时文件。软件会对临时文件进行存在性检查, 一旦发现文件存在则可以认定验证程序属非正常关闭。

3.3.2 死循环或长时间不响应检测。

同样出现在验证程序验证游戏逻辑的过程中, 验证程序可能会遇到游戏逻辑死循环或长时间不响应等情况, 从而导致软件出现不响应问题。为了避免这个问题, 软件在首先创建一个独立的进程, 然后通过这个进程打开验证程序, 同时对这个进程进行计时。一旦进程超过一定时间仍未结束, 软件将自动停止并关闭这个进程。

4 排行榜机制测试评估

实验软件中排行榜的目的是表现出学生间游戏逻辑算法的差异, 激励学生不断修改和完善算法程序, 取得好的游戏排名, 因此为了验证算法的差异, 确实能影响排行中的排名, 我选取了随机算法和一种智能算法进行了测试。

利用了智能算法的程序获胜的几率远大于简单的随机算法, 同时由于游戏的不可预见性, 随机算法同样会有胜利的可能, 确实反映了逻辑算法的差异会体现在排行榜中。

5 总结及展望

浅谈面向对象编程思想 篇3

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

中图分类号: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].华南师范大学学报

面向对象编程实验总结 篇4

介绍如何使用Perl的面向对象编程(OOP)特性及如何构建对象,还包括继承、方法重载和数据封装等内容。

一、模块简介

模块(module)就是Perl包(pachage)。Perl中的对象基于对包中数据项的引用。(引用见第x章引用)。

详见clearcase/“ target=”_blank“ >cc”>www.nease.net/tppmsgs/msgs0.htm#28的perlmod和perlobj。

在用其它语言进行面向对象编程时,先声明一个类然后创建该类的对象(实例),特定类所有对象的行为方式是相同的,由类方法确定,可以通过定义新类或从现存类继承来创建类。已熟悉面向对象编程的人可以在此遇到许多熟悉的术语。Perl一直是一个面向对象的语言,在Perl5中,语法略有变动,更规范化了对象的使用。

下面三个定义对理解对象、类和方法在Perl中如何工作至关重要。

.类是一个Perl包,其中含提供对象方法的类。

.方法是一个Perl子程序,类名是其第一个参数。

.对象是对类中数据项的引用。

二、Perl中的类

再强调一下,一个Perl类是仅是一个包而已。当你看到Perl文档中提到“类”时,把它看作“包”就行了。Perl5的语法可以创建类,如果你已熟悉C++,那么大部分语法你已经掌握了。与Perl4不同的概念是用双冒号(::)来标识基本类和继承类(子类)。

面向对象的一个重要特性是继承。Perl中的继承特性与其它面向对象语言不完全一样,它只继承方法,你必须用自己的机制来实现数据的继承。

因为每个类是一个包,所以它有自己的名字空间及自己的符号名关联数组(详见第x章关联数组),每个类因而可以使用自己的独立符号名集。与包的引用结合,可以用单引号(')操作符来定位类中的变量,类中成员的定位形式如:$class'$member。在Perl5中,可用双冒号替代单引号来获得引用,如:$class'$member与$class::$member相同。

三、创建类。

本节介绍创建一个新类的必要步骤。下面使用的例子是创建一个称为Cocoa的简单的类,其功能是输出一个简单的Java应用的源码的必要部分。放心,这个例子不需要你有Java的知识,但也不会使你成为Java专家,其目的是讲述创建类的概念。

首先,创建一个名为Cocoa.pm的包文件(扩展名pm是包的缺省扩展名,意为Perl Module)。一个模块就是一个包,一个包就是一个类。在做其它事之前,先加入“1;”这样一行,当你增加其它行时,记住保留“1;”为最后一行。这是Perl包的必需条件,否则该包就不会被Perl处理。

四、构造函数

构造函数是类的子程序,它返回与类名相关的一个引用,

将类名与引用相结合称为“祝福”一个对象,因为建立该结合的函数名为bless(),其语法为:

bless YeReference [,classname]

YeReference是对被“祝福”的对象的引用,classname是可选项,指定对象获取方法的包名,其缺省值为当前包名。

创建一个构建函数的方法为返回已与该类结合的内部结构的引用。如

sub new {

my $this = {}; # Create an anonymous hash, and #self points to it.

bless $this; # Connect the hash to the package Cocoa.

return $this; # Return the reference to the hash.

}

1;

五、方法

Perl类的方法只不过是一个Perl子程序而已,也即通常所说的成员函数。Perl的方法定义不提供任何特殊语法,但规定方法的第一个参数为对象或其被引用的包。Perl有两种方法:静态方法和虚方法。

静态方法第一个参数为类名,虚方法第一个参数为对象的引用。方法处理第一个参数的方式决定了它是静态的还是虚的。静态方法一般忽略掉第一个参数,因为它们已经知道自己在哪个类了,构造函数即静态方法。虚方法通常首先把第一个参数shift到变量self或this中,然后将该值作普通的引用使用。

六、方法的输出

如果你现在想引用Cocoa.pm包,将会得到编译错误说未找到方法,这是因为Cocoa.pm的方法还没有输出。输出方法需要Exporter模块,在包的开始部分加上下列两行:

require Exporter;

@ISA = qw (Exporter);

Perl类的继承是通过@ISA数组实现的。@ISA数组不需要在任何包中定义,然而,一旦它被定义,Perl就把它看作目录名的特殊数组。它与@INC数组类似,@INC是包含文件的寻找路径。@ISA数组含有类(包)名,当一个方法在当前包中未找到时就到@ISA中的包去寻找。@ISA中还含有当前类继承的基类名。

类中调用的所有方法必须属于同一个类或@ISA数组定义的基类。如果一个方法在@ISA数组中未找到,Perl就到AUTOLOAD()子程序中寻找,这个可选的子程序在当前包中用sub定义。若使用AUTOLOAD子程序,必须用use Autoload;语句调用autoload.pm包。AUTOLOAD子程序尝试从已安装的Perl库中装载调用的方法。如果AUTOLOAD也失败了,Perl再到UNIVERSAL类做最后一次尝试,如果仍失败,Perl就生成关于该无法解析函数的错误。

七、方法的调用

调用一个对象的方法有两种方法,一是通过该象的引用(虚方法),一是直接使用类名(静态方法)。

暂时写到这里,下次继续!

面向对象编程实验总结 篇5

第六次实验: 友元的使用方式

1.学时:2课时; 2.实验类型:验证性实验 3.实验目的:

(1)了解友元机制的由来和本质;(2)理解友元机制的主要作用;

(3)掌握友元函数、友元成员和友元类的声明、定义和使用方法,并注意友元机制的安全风险问题。

4.实验内容:

实验题目1:友元函数的声明、定义和使用(1)程序功能简介

编程实现一个类的友元函数的声明、定义和使用代码。(2)程序设计要求

① 采用声明和定义分开的方式实现一个类的友元函数;

② 通过调用友元函数,实现对一个类内所有访问权限的成员进行访问,验证友元机制。(3)程序设计说明

① 参考教材例4.2(见P86)、例4.3(见P86)、例4.4(见P87)。(4)撰写实验报告

参考实验报告模板。

实验题目2:友元成员和友元类的声明、定义和使用(1)程序功能简介

编程实现一个类的友元成员和友元类的声明、定义和使用代码。(2)程序设计要求

① 采用声明和定义分开的方式实现一个类的友元成员和友元类; ② 通过调用友元成员以及友元类的对象,实现对一个类内所有访问权限的成员进行访问,验证友元机制。(3)程序设计说明

① 参考教材例4.5(见P91)、例4.6(见P92)、例4.7(见P93)。(4)撰写实验报告

参考实验报告模板。实验题目3:利用友元机制计算两点之间的距离(1)程序功能简介

设计一个点(Point)类,其中包括一对坐标数据成员、一个求两点之间距离的友元接口和显示坐标点的成员函数,并用数据进行测试。(2)程序设计要求

① 首先,采用友元函数distance()的方式实现友元接口; ② 其次,采用友元成员distance()的方式实现友元接口; ③ 最后,尝试采用友元类的方式实现友元接口。(3)程序设计说明

① 在头文件中声明类,在程序文件中定义类的成员函数; ② 采用构造函数进行对象的初始化;

③ 对于友元成员和友元类两种实现方式,可以另外定义一个求解两点距离的ComputeDistance类,将distance()作为该类的成员函数。(4)撰写实验报告

面向对象分析与设计课程总结 篇6

课程总结

0923010208 指导老师:庄育飞

这学期学院开设了面向对象分析与设计(UML)这门课,通过老师的讲解,自己一些相关书籍的阅读和实践作业的完成,逐步对课程有了由浅及深的认识。我觉得学习这门课还是受益匪浅的。

面向对象(Object Oriented,OO)是一门以实践为主课程,课程中可以分开两块OOA(面向对象系统分析)和OOD(面向对象系统设计)。

OOA(面向对象系统分析)主要内容: 研究问题域和用户需求,运用面向对象的观点和原则发现问题域中与系统责任有关的对象,以及对象的特征和相互关系.OOA不涉及针对具体实现采取的设计决策和有关细节,独立于具体实现的系统模型。是一个完整确切反映问题域和用户需求的系统模型。OOA的优势:复

用、可扩展、可维护性、弹性。

OOD(面向对象系统设计):以OOA模型为基础,按照实现的要求进行设计决策,包括全局性的决策和局部细节的设计,与具体的实现条件相关。OOD的步骤:细化重组类→细化和实现类之间的关系,明确其可见性→增加属性,指定属性的类型和可见性→分配职责,定义执行每个职责的方法→对消息驱动的系统,明确消息传递的方式→利用设计模式进行局部设计→画出详细的类图和时序图。

面向对象的分析与设计方法将致力于解决传统软件研发过程中由于软件模块化结构化程度不高带来的软件重用性差、软件可维护性差、开发出的软件不能满足用户需要等方面问题。面向对象的概念包括:对象、对象的状态和行为、类、类的结构、消息和方法。对象概念将包含对象唯一性、抽象性、继承性、多态性的重要特征。面向对象的要素包含:抽象、封装性、共享性三方面。

在设计模式的研究过程中,我们组选择的是迭代器(Iterator)的设计模式研究。完成设计研究后,我对迭代器的设计模式有了更为深刻的理解。迭代器(Iterator)提供一个方法顺序访问一个聚合对象的各个元素,而又不暴露该对象的内部表示。并了解到迭代器设计模式一般在以下三类场合使用较多。

 访问一个聚合对象的内容而无需暴露它的内部表示。

 支持对聚合对象的多种遍历。因为遍历状态是保存在每一个迭代器对象中的。

 为遍历不同的聚合结构提供一个统一的接口。根据实现方式的不同,效果上会有差别。同时还简化了容器的接口。但是在java Collection中为了提高可扩展性,容器还是提供了遍历的接口。

在面向对象的软件设计中,我们经常会遇到一类集合对象,这类集合对象的内部结构可能有着各种各样的实现,但是归结起来,无非有两点是需要我们去关心的:一是集合内部的数据存储结构,二是遍历集合内部的数据。面向对象设计原则中有一条是类的单一职责原则,所以我们要尽可能的去分解这些职责,用不同的类去承担不同的职责。Iterator模式就是分离了集合对象的遍历行为,抽象出一个迭代器类来负责,这样既可以做到不暴露集合的内部结构,又可让外部代码透明的访问集合内部的数据。

在Java Collection的应用中,提供的具体迭代器角色是定义在容器角色中的内部类。这样便保护了容器的封装。但是同时容器也提供了遍历算法接口,你可以扩展自己的迭代器。至于迭代器模式的使用。客户程序要先得到具体容器角色,然后再通过具体容器角色得到具体迭代器角色。这样便可以使用具体迭代器角色来遍历容器了。

OOA和OOD之间没有明显的界限。OOA与OOD的不可分割性正好说明了OO思想的强大,即软件过程阶段的无缝连接,在交流与沟通中不会产生鸿沟,这是相对结构化思想的好处,因为从功能模块到某块详细控制逻辑设计两者之间的联系不是十分紧密,需要分析人员与设计人员的再沟通。

通过课程的学习与实践,对面向对象的理念,以及相关方法,设计模式有了更为深刻的理解与掌握。针对面向对象的分析与设计课程的授课内容及方法,我个人觉得对我还是有不少的帮助和 提高。结合自己的工作,虽然与开发接触的比较少,但是在运维过程中,如果能了解开发原理,结合实际的工作,会对一些源代码的分析能力以及工作效率的提高起到明显的帮助作用。

庄老师上课经常说一些与课程无关的内容,我已开始并不理解他的作法,后来我慢慢认识到面向对象分析设计的学习就是培养思想的一种过程,这种思维方式还是需要大量的实践才能灵活的运用。目前的阶段,只能说是知道有这样一种设计思想、这种解决问题的方案,至于在何时应该使用、如何去使用,就需要在今后的经验中去累积了。

下面是一些我掌握的基础知识

9种UML图:

类 图:描述类的结构(包括属性以及类之间的相互关系)

对象图:对象以及对象之间的相互关系

构件图:构件及其相互依赖关系

部署图:构件在各节点上的部署

顺(时)序图:强调时间顺序的交互图,用于将系统行为分配给类。一般包含了边界、控制、实体对象

协作图:强调对象协作的交互图,与时序图同构

状态图:类所经历的各种状态,包括状态之间的转换以及触发转变的事件

活动图:对工作流程建模

用例图:与用例文档结合进行需求捕获,测试依据

面向对象设计七个原则:

开-闭 原则、里氏转换原则、依赖倒转原则、接口隔离原则、组合/聚合复用原则、迪米特法则、单一职责

ICONIX开发过程:域模型——用例文档——健壮性分析——健壮图——时序图

设计模式:

1)创建模式: 涉及对象的创建

单例模式, 工厂模式, 建造者模式,原型模式

2)结构模式:涉及类和对象的组合

Facede外观模式, 代理模式, 适配器模式, 装饰模式

3)行为模式: 刻画了类和对象交换及分配职责的方式.主要目标是解耦

观察者模式, 命令模式, 模板模式

本学期学了《面向对象系统分析与设计》课程,本课程我们主要是学习了面向对象的统一建模语言UML,了解面向对象技术的基本概念,掌握面向对象的分析和设计方法,以及与面向对象技术相关的一些软件开发技术,同时掌握在IBM RSA软件环境下用UML进行分析和设计的技术。在《面向对象系统分析与设计》 的上级课程上,我们的实践能力方面着重设计构思和设计技能的得到基本训练,熟练的上机操作能力和分析能力,加深理解、验证、巩固课堂教学内容。

数据库是以信息处理为核心的任何应用系统的基础,数据库设计的质量直接关系到系统开发的成败和优劣。数据库设计的方法与系统使用的开发方法有着密切的关系,同时还与所应用的数据库模型(层次模型、网状模型、关系模型、对象模型)有关。目前经常采用E—R(Entity—Relationship)图的方法设计数据库。但E—R图设计数据库存在的主要问题是只能对资料建模,而不能对行为建模。而UML类图的描述能力更强,UML类图是E—R图的扩充。对于关系模型来说,可以用类图描述数据库模式,用类描述数据库表。

UML是应用面向对象方法进行系统开发的全程建模语言,可用于业务分析、需求分析、系统设计、系统实现与测试等系统开发的各个环节。UML概念设计的基本工作分为两个方面:

· 一是从系统分析和系统设计所建立的各种类图中抽取持久型类。

· 二是确定持久型类之间的关系,并用类图描述这种关系,从而把类图作为数据

库概念设计的结果。

1.抽取持久型类

持久型类是指类的完整信息需要在数据库中存储的类。在UML中,类可以分为

边界类、实体类和控制类三种类型。

· 接口类和控制类的信息一般不需要长久存储。

· 持久型类只可能是实体类,但并不是所有实体类的信息都需要长久地存储,持久型类只需要从那些信息需要长久存储的实体类中抽取。

2.确定类关系

在比较复杂的系统分析和设计中,并没有建立立足于整个系统的整体类图,而只是建立了一个个针对具体用例的类图。也就是说,所提取的持久型类被分散到各个用例类图当中了。因此,需要对抽取的持久型类进行分析,以确定它们之间的相互关系,建立起反映这些类关系的类图。

UML数据建模与E—R图有着本质的区别。在E—R图中,应用型数据库系统的重点是数据库结构。概念设计是应用型数据库系统开发的重点和难点。而UML是用于面向对象系统开发的全程建模语言,可用于需求分析、系统分析与设计、系统实现、系统测试等系统开发的所有环节。由于UML基于面向对象技术,而要保持方法的一致性,最好选择面向对象数据库。但是,目前的面向对象数据库在实现技术上还不十分成熟,即使应用面向对象技术和环境开发应用系统,通常的做法是使用UML进行建模,用关系型数据库储存和管理数据。

通过一学期的学习和实践,我了解到uml具有以下特点[1]:

(1)面向对象。uml支持面向对象技术的主要概念,提供了一批基本的模型元素的表示图形和方法,能简洁明了地表达面向对象的各种概念。

(2)可视化,表示能力强。通过uml的模型图能清晰地表示系统的逻辑模型和实现模型。可用于各种复杂系统的建模。

(3)独立于过程。uml是系统建模语言,独立于开发过程。

(4)独立于程序设计语言。用uml建立的软件系统模型可以用Java、vc++、smalltaik等任何一种面向对象的程序设计来实现。

(5)易于掌握使用。uml图形结构清晰,建模简洁明了,容易掌握使用。使用uml进行系统分析和设计,可以加速开发进程,提高代码质量,支持动态 的业务需求。uml适用于各种规模的系统开发。能促进软件复用,方便地集成已有的系统,并能有效处理开发中的各种风险。

而且uml是一种功能强大的、面向对象的可视化系统分析的建模语言,它采用一整套成熟的建模技术,广泛地适用于各个应用领域。它的各个模型可以帮助开发人员更好地理解业务流程,建立更可靠、更完善的系统模型。从而使用户和开发人员对问题的描述达到相同的理解,以减少语义差异,保障分析的正确性。

通过对学籍管理系统的开发可以看到,uml作为软件工程中的建模语言,代表了面向对象方法的软件开发技术的发展方向,具有重大的经济价值和国防价值,并获得了国际上的广泛支持,具有非常好的应用前景。

面向对象编程实验总结 篇7

面向对象编程在高级语言程序开发中早已被证明是一种高效的编程方式,但在工业自动化领域一直未能应用和推广。其主要原因有两个:

一是自动控制工程师有自己的知识结构体系。自动控制工程师很熟悉梯形图、顺序功能流程图等PLC编程语言,也掌握了很多结构化编程技巧,但很少去了解高级编程语言最新的编程思想和编程方法,因为大多数控制工程师认为PLC编程和高级语言编程是两个完全不同的门类,工作中基本不会涉及到高级语言编程,很少人去学习高级语言编程知识。

二是现在主流的PLC程序开发软件还不能提供全面支持面向对象编程的开发环境。

当前PLC编程工程师都有自己习惯的编程方式,即使同一个公司也很难形成统一的编程风格。技术人员流动造成后续程序维护非常困难,一旦问题出现,理解、消化别人的程序就需要花费很长时间,再加上工程师技术水平参差不齐,对程序、工艺的理解不同,很难避免在修改完善程序时出现纰漏,结果是旧的问题没解决,新的问题又出现,造成控制程序更加不稳定,故障率不减反增,给企业带来更坏的负面效应。

面向对象编程技术的应用,能有效解决目前选煤厂程序维护困难的问题。面向对象编程技术通过对选煤厂设备类模型封装,为选煤厂编程的标准化提供了技术保证。工程师统一经过选煤厂面向对象编程技术的学习,掌握设备类模型的使用,然后在编程时导入选煤厂设备类模型,形成统一的编程风格,统一设计,统一思路。这样不仅能解决程序维护问题,还可以空出更多时间集中所有工程师的智慧,共同升级选煤厂设备类模型,开发更稳定高效的选煤厂设备类模型,提高选煤厂控制程序的运行性能。

2 面向对象编程技术的特点

面向对象的编程包含4 个基本特征: 抽象、继承、封装和多态性[1]。因选煤厂设备具有特定的控制特点,在选煤厂面向对象程序编程中,仅采用面向对象中抽象和封装这两个基本特征,就能完全满足选煤厂设备控制的要求。

面向对象的概念说明: 抽象是对实体对象本质、内在属性和行为的高度总结和概括,类是计算机实现对象的特性和行为的抽象。封装是保证软件部件具有良好模块性的基础,面向对象的类是封装良好的模块。

面向对象是对特定对象的研究,类是具有相同特性和行为对象的抽象,对象越少,类的种类就越少,编程就更简单。面向对象编程技术适用于控制对象的特性和行为相同或相似,可以抽象为同一种类的应用场合。

3 选煤厂设备的控制特点分析

在选煤厂编程设计中,主要的程序代码是实现对大量的选煤设备启停控制和运行监视。选煤厂设备包括胶带机、振动筛、泵、离心机、磁选机和阀门等几类工艺设备,所有设备虽然外形和功能上有很大不同,但从控制角度看,这些设备都有共同的特点。设备的控制数据可以概括为:上位机指令、输入信号、时间设定和输出信号;控制操作可以概括为: 正转、反转和停止( 或打开、关闭和停止) 等。正因为选煤厂设备具备这一相同控制特点,面向对象编程技术才得以应用在选煤厂控制系统编程中。

为统一概念,本文将选煤厂设备控制对象抽象定义为设备类,设备控制特性定义为设备属性,设备控制行为定义为设备操作。设备类是设备属性和设备操作的封装体,通过设备属性接口完成设备的信号输入和控制输出,设备操作完成设备的逻辑控制功能,设备类模型如图1 所示。

4 面向对象编程的实现过程

选煤厂面向对象编程的重点是开发设计选煤厂设备类,设备类设计完成后,通过简单的重复实例化就能快速完成软件编程。下面以潞安集团常村煤矿选煤厂600 万t扩能改造工程中的软件编程为例,详细阐述面向对象编程技术在选煤厂编程设计中的应用。

本工程使用施耐德公司Quantum系列PLC,编程软件是Unity Pro XL[2]。Unity Pro XL是施耐德公司高端PLC编程软件,支持DDT类型( 结构) 和DFB类型( 用户功能块模型) 。在工程中使用DDT结构功能实现设备属性的封装,使用DFB用户功能块模型实现设备操作的封装。

4. 1 设备属性的抽象和封装

设备属性的抽象和封装,要求封装后的设备属性满足所有不同类型选煤厂控制设备的要求。

4. 1. 1 设备属性的抽象

依据多年一线选煤厂控制编程经验,将选煤厂设备属性抽象概括为4 个子属性:

( 1) 上位机指令( 图2 所示) 。上位机指令子属性包含设备的上位机启动和停止、设备工作模式转换、报警复位、设备自动启动方式和设备保护开关投入、撤消等上位机操作指令。

( 2) 输入信号( 图3 所示) 。输入信号子属性包含现场按钮输入、一次回路和二次回路电器输入、胶带保护输入和设备的相关保护开关输入等设备硬件输入信号。

( 3) 时间设定( 图4 所示) 。时间设定子属性包含设备启停时间设定、堵塞滤波时间设定、再启动时间设定等与设备特性相关的时间设定。

( 4) 输出信号( 图5 所示) 。输出信号子属性包括低压设备启动输出、高压设备脉冲启停输出、运行状态输出、故障输出、设备状态输出、故障代码输出等设备控制和状态输出。

4. 1. 2 设备属性的封装

潞安集团常村煤矿选煤厂项目中,采用Unity Pro XL编程软件中DDT( 用户自定义数据类型) 对设备属性进行封装。DDT是一种结构型数据类型,封装后名称为Device,如图6 ~10 所示。

Device结构包含4 个子元素: CMD、 STU、TIM和O。CMD是上位机指令的封装; STU是输入信号的封装; TIM是时间设定的封装; O是输出信号的封装。Device结构完整地封装了选煤厂设备属性。

4. 2 设备操作的抽象和封装

选煤厂设备控制操作可以抽象概括为: 工作模式切换、正反转启停、报警、自动启停及电铃预警等。所有这些操作的逻辑程序通过DFB用户功能块模型进行封装。图11 所示,在Unity Pro XL中,通过开发Device _ Block用户功能块模型封装选煤厂设备操作。

Device Block用户功能块模型设计由CMD、STU和TIM类型的输入以及O类型的输出构成,目的是与设备属性Device结构类型匹配,从而实现设备属性和设备操作功能块之间的数据交换。Device Block用户功能块模型DLogix段包含所有设备操作的逻辑程序,DLogix段控制逻辑程序内容较多,这里不再详述。

4. 3 面向对象编程在常村选煤厂的应用过程

4. 3. 1 设备类的实例化

设备属性和设备操作完成封装后,一个满足选煤厂设备控制的设备类设计完成,接下来的工作是实例化设备类。设备属性通过数组阵列实例化。该工程中选煤厂的控制设备数为124 台,考虑备用创建了含150 个Device结构元素的数组阵列U,如图12 所示。

每个数组元素包含一个设备属性实例,U[0] 是设备252 的属性,U [1] 是设备302 的属性,其他同理。设备操作通过功能块实例化。实例化过程非常简单,首先创建一个DeviceBlock类型的功能块,然后复制粘贴。本工程共生成了150 个DeviceBlock类型的功能块,如图13 所示。

每个功能块包含一个设备中所有的设备操作,U0 是设备252 的操作封装实例,U1 是设备302 的操作封装实例,其他同理。

设备属性和设备操作实例化完成后,通过一个连接程序将设备属性U [i] 和设备操作Ui连接成一个完整的设备实例。本工程中连接程序代码是采用结构化文本编程语言编写的,如图14所示。

从图中可以看到连接程序代码编写很简单。设备实例化完成后,到此设备的控制逻辑程序就全部编写完成,接下来就是设计一个硬件输入、输出和设备属性的插接程序。

4. 3. 2 设备硬件输入和输出接口程序设计

面向对象编程中每个设备输入和输出接口程序是相同的。输入信号通过PLCinput输入接口程序与设备属性中的输入属性连接,如图15 所示。

PLCinput程序是用来将PLC系统的硬件输入连接到软件中相应的设备输入属性的一个插接程序。图中U [0]( 252 刮板输送机) 输入有: 设备应答( 停止按钮输入) ; 设备正转( 正转启动按钮输入) ; 设备反转( 反转启动按钮输入) ; 设备断路器返回( 断路器合闸输入) ; 设备正转返回( 正转接触器吸合输入) ; 设备反转返回( 反转接触器吸合输入) ; 设备过载一( 热继电器或电机综合保护动作输入) ; 设备欠速一( 速度减慢或断链输入) ; 设备欠速二( 因未设置第二欠速输入,故连接一个正常变量) ; 设备堵塞一( 一号溜槽输入) ; 以及其他输入。U [1]( 302G给煤机) 硬件输入少,配置的输入也少,可以按需灵活配置。同样,PLC硬件输出通过PLCoutput输出接口程序与设备属性中的输出属性连接,如图16所示。

PLCoutput程序也是一个插接程序,用来完成软件中的设备输出属性到PLC系统的物理输出连接。U [0]( 252 刮板输送机) 输出有正转和反转,U [1]( 302G给煤机) 输出只有正转,输出配置程序简单易读。

PLCinput和PLCoutput程序编制完成后,程序中的设备属性状态就能真实反映设备的硬件工作状态,同时也可以操作实体设备的启停。

程序运行后上位集控系统通过读写设备属性中的属性变量,监视设备运行状态和操作设备。

5 面向对象编程在常村选煤厂的应用优势

在潞安集团常村煤矿选煤厂程序现场调试过程中,感受到采用面向对象编程技术带来的程序监视方面的优势: 设备的所有运行状态和设置参数都可以在Unity Pro XL的动态数据表中进行监视和修改。与过去的编程方式相比,设备运行状态和故障信号可以集中监视,查询信号更加简单,故障定位更加容易,如图17 所示。

过去设备属性只能在梯形图程序中监视,故障排查困难,排查时间长。现在PLC程序运行后,可以通过不同设备属性CMD结构中的变量监控设备的上位机指令,通过STU监视设备的输入,通过O监视设备的输出,通过TIM结构中的变量修改设备的运行特性。这样就能集中监视设备运行状态,提供了一种高效的监视设备运行状态的方法,它能极大的缩短设备故障排查时间。

本工程在调试过程中,发现之前设计的设备类对一些特殊设备未能实现完整兼容,后经过对设备类的属性和操作进行修改完善,现已能很好的实现选煤厂设备的全兼容。设备类的修改过程较传统方法节省了许多时间,设计人员不需要对每个设备的属性和操作逐一进行修改,只需要一次性改变原始设备类的属性和操作,便能完成所有设备的修改工作。

工程完成后,利用编程软件Unity Pro XL的导入导出功能将常村选煤厂的设备类导出,便可以把调试好的设备类用于后续其他选煤厂工程中,这不但能缩短后续选煤厂控制系统软件的编程时间,而且通过对选煤厂设备类逐步升级完善,可以逐步提高选煤厂控制系统运行的稳定性和可靠性。

6 结语

面向对象编程技术在选煤厂控制程序编程中的应用,不但能够实现快速、高效的编程,而且能够提供对程序的管理。

面向对象编程技术主要解决了传统程序设计方法所不能解决的代码重用问题。它不但能利用类的重用性缩短软件开发时间,提高编程效率,而且能通过对类的标准化设计和统一管理实现对程序设计的统一管理,从而减少因工程师的编程能力差异而造成的程序运行不稳定等问题。

标准化的设备类模型设计完成后,工程师通过升级设备类模型,便可提升选煤厂程序的运行性能。同时设备类模型也能简化选煤厂的程序维护工作,任何一个软件工程师使用设备类模型开发的程序,其他工程师都可以轻松的对其设计的原程序进行阅读、修改和完善。

潞安集团常村煤矿选煤厂扩能改造工程投入运行后程序运行稳定可靠,充分展现了面向对象技术在选煤厂控制系统编程应用中的优越性。在潞安集团常村煤矿选煤厂扩能改造工程中,编程仅花费了10 个工日。按之前的编程方法,同等规模的焦煤选煤厂控制程序设计时间至少需要40个工日。本次面向对象编程技术的成功应用,将大为缩短后续选煤厂工程的编程工作时间,同时也会推进选煤厂编程的标准化进程。

摘要:为解决选煤厂控制系统程序编程设计中编程风格不统一、程序无法统一管理、程序编程和调试时间长、程序不稳定及程序维护难等问题,在编程设计中引入了面向对象编程技术;通过常村煤矿选煤厂控制系统程序设计实例,阐述面向对象编程技术的具体实现过程,项目运行后达到了预期效果,展现了该技术在选煤厂控制系统程序设计中的优势。

关键词:选煤厂,控制系统,PLC,面向对象,编程

参考文献

[1]Matt Weisfeld.张雷生等译.写给大家看的面向对象编程书[M].人民邮电出版社,2009.

PHP中面向对象设计的经验总结 篇8

你不必严格遵守这些原则,违背它们也不会被处以宗教刑罚。但你应当把这些原则看成警铃,若违背了其中的一条,那么警铃就会响起。-----Arthur J.Riel

1.所有数据都应该隐藏在所在的类的内部。

2.类的使用者必须依赖类的共有接口,但类不能依赖它的使用者。3.尽量减少类的协议中的消息。

4.实现所有类都理解的最基本公有接口[例如,拷贝操作(深拷贝和浅拷贝)、相等性判断、正确输出内容、从ASCII描述解析等等]。

5.不要把实现细节(例如放置共用代码的私有函数)放到类的公有接口中。如果类的两个方法有一段公共代码,那么就可以创建一个防止这些公共代码的私有函数。6.不要以用户无法使用或不感兴趣的东西扰乱类的公有接口。

7.类之间应该零耦合,或者只有导出耦合关系。也即,一个类要么同另一个类毫无关系,要么只使用另一个类的公有接口中的操作。

8.类应该只表示一个关键抽象。包中的所有类对于同一类性质的变化应该是共同封闭的。一个变化若对一个包影响,则将对包中的所有类产生影响,而对其他的包不造成任何影响。9.把相关的数据和行为集中放置。设计者应当留意那些通过get之类操作从别的对象中获取数据的对象。这种类型的行为暗示着这条经验原则被违反了。

10.把不相关的信息放在另一个类中(也即:互不沟通的行为)。朝着稳定的方向进行依赖。11.确保你为之建模的抽象概念是类,而不只是对象扮演的角色。

12.在水平方向上尽可能统一地分布系统功能,也即:按照设计,顶层类应当统一地共享工作。13.在你的系统中不要创建全能类/对象。对名字包含Driver、Manager、System、Susystem的类要特别多加小心。规划一个接口而不是实现一个接口。

14.对公共接口中定义了大量访问方法的类多加小心。大量访问方法意味着相关数据和行为没有集中存放。

15.对包含太多互不沟通的行为的类多加小心。这个问题的另一表现是在你的应用程序中的类的公有接口中创建了很多的get和set函数。

16.在由同用户界面交互的面向对象模型构成的应用程序中,模型不应该依赖于界面,界面则应当依赖于模型。

17.尽可能地按照现实世界建模(我们常常为了遵守系统功能分布原则、避免全能类原则以及集中放置相关数据和行为的原则而违背这条原则)。

18.从你的设计中去除不需要的类。一般来说,我们会把这个类降级成一个属性。19.去除系统外的类。系统外的类的特点是,抽象地看它们只往系统领域发送消息但并不接受系统领域内其他类发出的消息。

20.不要把操作变成类。质疑任何名字是动词或者派生自动词的类,特别是只有一个有意义行为的类。考虑一下那个有意义的行为是

否应当迁移到已经存在或者尚未发现的某个类中。

21.我们在创建应用程序的分析模型时常常引入代理类。在设计阶段,我们常会发现很多代理没有用的,应当去除。

22.尽量减少类的协作者的数量。一个类用到的其他类的数目应当尽量少。23.尽量减少类和协作者之间传递的消息的数量。

24.尽量减少类和协作者之间的协作量,也即:减少类和协作者之间传递的不同消息的数量。25.尽量减少类的扇出,也即:减少类定义的消息数和发送的消息数的乘积。26.如果类包含另一个类的对象,那么包含类应当给被包含的对象发送消息。也即:包含关系总是意味着使用关系。

27.类中定义的大多数方法都应当在大多数时间里使用大多数数据成员。

28.类包含的对象数目不应当超过开发者短期记忆的容量。这个数目常常是6。当类包含多于6个数据成员时,可以把逻辑相关的数据成员划分为一组,然后用一个新的包含类去包含这一组成员。

29.让系统功能在窄而深的继承体系中垂直分布。

30.在实现语义约束时,最好根据类定义来实现。这常常会导致类泛滥成灾,在这种情况下,约束应当在类的行为中实现,通常是在构造函数中实现,但不是必须如此。31.在类的构造函数中实现语义约束时,把约束测试放在构造函数领域所允许的尽量深的包含层次中。

32.约束所依赖的语义信息如果经常改变,那么最好放在一个集中式的第3方对象中。33.约束所依赖的语义信息如果很少改变,那么最好分布在约束所涉及的各个类中。34.类必须知道它包含什么,但是不能知道谁包含它。

35.共享字面范围(也就是被同一个类所包含)的对象相互之间不应当有使用关系。36.继承只应被用来为特化层次结构建模。

37.派生类必须知道基类,基类不应该知道关于它们的派生类的任何信息。

38.基类中的所有数据都应当是私有的,不要使用保护数据。类的设计者永远都不应该把类的使用者不需要的东西放在公有接口中。

39.在理论上,继承层次体系应当深一点,越深越好。

40.在实践中,继承层次体系的深度不应当超出一个普通人的短期记忆能力。一个广为接受的深度值是6。

41.所有的抽象类都应当是基类。42.所有的基类都应当是抽象类。

43.把数据、行为和/或接口的共性尽可能地放到继承层次体系的高端。

44.如果两个或更多个类共享公共数据(但没有公共行为),那么应当把公共数据放在一个类中,每个共享这个数据的类都包含这个类。

45.如果两个或更多个类有共同的数据和行为(就是方法),那么这些类的每一个都应当从一个表示了这些数据和方法的公共基类继承。

46.如果两个或更多个类共享公共接口(指的是消息,而不是方法),那么只有他们需要被多态地使用时,他们才应当从一个公共基类继承。

47.对对象类型的显示的分情况分析一般是错误的。在大多数这样的情况下,设计者应当使用多态。

48.对属性值的显示的分情况分析常常是错误的。类应当解耦合成一个继承层次结构,每个属性值都被变换成一个派生类。

49.不要通过继承关系来为类的动态语义建模。试图用静态语义关系来为动态语义建模会导致在运行时切换类型。

50.不要把类的对象变成派生类。对任何只有一个实例的派生类都要多加小心。

51.如果你觉得需要在运行时刻创建新的类,那么退后一步以认清你要创建的是对象。现在,把这些对象概括成一个类。

52.在派生类中用空方法(也就是什么也不做的方法)来覆写基类中的方法应当是非法的。53.不要把可选包含同对继承的需要相混淆。把可选包含建模成继承会带来泛滥成灾的类。54.在创建继承层次时,试着创建可复用的框架,而不是可复用的组件。

55.如果你在设计中使用了多重继承,先假设你犯了错误。如果没犯错误,你需要设法证明。56.只要在面向对象设计中用到了继承,问自己两个问题:(1)派生类是否是它继承的那个东西的一个特殊类型?(2)基类是不是派生类的一部分?

57.如果你在一个面向对象设计中发现了多重继承关系,确保没有哪个基类实际上是另一个基类的派生类。

上一篇:风来了的评课稿下一篇:超生游击队小品剧本