《第3章面向对象设计》由会员分享,可在线阅读,更多相关《第3章面向对象设计(34页珍藏版)》请在金锄头文库上搜索。
1、第第3章章 面向对象设计面向对象设计3.1 面向对象概述面向对象是一种模块化的、以对象为基础的设计思想,现在被广泛应用于软件设计领域。本节将讲述面向对象的基本概念,以及如何使用面向对象的思想来设计。3.1.1 对象的概念在面向对象思想中,最基本的单元就是对象。对象可以代表任何事物,从个人到整个学校,一个整数到一个数据集合,一滴水到一条大河等,这些都可以看作是一个对象。对象不仅表示有形的实体,也可以表示无形的、抽象的事物,如课程、计划等。3.1.2 面向对象的设计方法面向对象方法(Object-Oriented Method)是把面向对象的思想应用于软件的开发中。从程序的角度来看,对象则是被封装
2、起来的代码块,或者称为一个功能模块。在对象中,包含着若干个属性和方法。在面向对象中,和对象有直接关系的就是类。类是对象的一个抽象的概念,对象则是类的一个实例化。例如,如果把某个苹果看作是一个对象,则这个苹果可以抽象为一个水果类,这个苹果也是水果类的实例化。面向对象的主要特征有3个:封装性、继承性和多态性。3.2 命 名 空 间命名空间是用来组织类的。通常可以把相关联的类放在一个命名空间中,进行有效的管理。本节将介绍如何定义命名空间,以及如何引用。3.2.1 命名空间的概念组织代码的最基本的单元就是类。把每个类分别写在一个文件中,可以更好地组织代码的结构。但是,有时候还需要组织各个类,将再次分类
3、的类组织起来。微软公司的.NET架构提供了一种可以组织类的概念,那就是命名空间。在.NET框架中,已经定义了很多系统的类,并存放在命名空间System中。3.2.2 命名空间的定义和引用用户可以自己定义命名空间,以便程序的功能可以更好地得到扩展,代码也可以更加有效合理地组织起来。本节介绍如何定义和引用命名空间。1命名空间的定义2命名空间的引用使用命名空间之前,要先引用。引用命名空间是利用using关键字,后跟命名空间的名称。引用命名空间CustomNamespace1的代码如下:using CustomNamespace1;3.3 类类是面向对象中最为重要的概念之一,是面向对象设计中最基本的组
4、成模块。类可以简单地看作一种数据结构。本节讲述类的概念、如何声明类、类的成员等。3.3.1 类的概念在现实生活中,可以找出很多关于类的例子。例如,学生可以看作是一个类,那么某个同学就是这个学生类的一个实例化对象。同样,老师也可以看作是一个类,某个老师是老师类的一个实例化对象。从软件设计的角度来说,类就是一种数据结构,用于模拟现实中存在的对象和关系,包含静态的属性和动态的方法。3.3.2 类的声明C#中类的声明需要使用class关键字,并把类的主体放在花括号中,格式如下:1.class-modifiers class class-name2.3. /属性4. /方法5.3.3.3 类的成员和访问
5、控制从类的继承关系上讲,类的成员可以分为两大类:类本身声明的和从基类继承的。类的成员的类型有以下几种:常量、变量、方法、属性、事件、索引指示器、操作符以及构造函数和析构函数。从类的访问角度上来讲,类的成员又可以分为四类:公有成员、私有成员、保护成员及内部成员。3.3.4 构造函数和析构函数构造函数主要的作用是执行类的实例的初始化。析构函数主要的作用就是回收系统占用的资源。1构造函数在实例化对象的时候,对象的初始化是自动完成的,并且这个对象是空的。有时候,希望每创造一个对象时都为其初始化某些特征,这时就需要用到构造函数。2析构函数上面介绍了使用构造函数在实例化对象时自动完成了一些初始化工作。反过
6、来,在销毁对象的时候,有时候也希望能自动完成一些“收尾”任务。例如,关闭数据库连接等,C#使用析构函数来完成这个功能。3.4 域 和 属 性域和属性都提供了保存类的实例的数据信息的方法。域就是表示对象或类相关联的变量,属性则实现了数据的封装和隐藏。本节将重点讲述域和属性的概念和基本用法。3.4.1 域域可以简单地理解为成员变量,其主要作用是保存数据信息。域的修饰符可以是以下几种:new,public,internal,protected,static和readonly。例如,下面的代码段就是在类Class1中,声明了3个域。代码如下:1.class Class12.3. public int
7、a;4. protected string b;5. private decimal c;6.3.4.2 属性属性可以看作是实体特征的抽象表现。例如,一个学生的姓名、一个软件的大小、一个班级的人数等,这些都可以作为属性来表示。属性的声明涉及两个关键字:get和set。get:表示对属性的读操作。set:表示对属性的写操作。3.5 抽 象 类面向对象编程思想试图模拟现实中的对象和关系。但是,有时候,基类并不是与具体的事物相联系的,而是表达一种抽象的概念。抽象类就可以满足这种关系。本节讲述抽象类的概念和使用。3.5.1 抽象类的概念现实中,存在如图3-3所示的对象及关系,父类“运动员”有3个子类,
8、这3个子类都可以继承父类的“训练”这个方法,但是,仔细考虑一下,父类“运动员”的训练该如何实现呢?3.5.2 抽象类的声明上面介绍了什么是抽象方法和抽象类,现在来看如何在C#中实现。(1)在C#中,使用关键字abstract来定义抽象方法(abstract method),并需要把abstract关键字放在访问级别修饰符和方法返回数据类型之前,没有方法实现的部分,格式如下:public abstract void Train();(2)子类继承抽象父类之后,可以使用override关键字覆盖父类中的抽象方法,并做具体的实现,格式如下:public override void Train() 3
9、.5.3 抽象方法子类在继承了抽象父类之后,就可以具体实现其中的抽象方法了。3个子类运动员分别实现了抽象方法Train()。3.6 接 口接口实际上是定义了一组数据结构,通过这组数据结构,可以调用组件对象的功能。接口和抽象类很相似,在本节中,除了讲解接口的概念和使用外,还会讲述接口与抽象类的区别。3.6.1 接口的概念接口和抽象类非常相似,它定义了一些未实现的属性和方法。所有继承它的类都继承这些成员,在这个角度上,可以把接口理解为一个类的模板。3.6.2 接口的声明下面通过一个具体的例子,介绍如何在C#中声明和使用接口。示例中有一个“形状”的概念,它有3个具体的形状类:矩形、圆形、三角形。可以
10、看出,在某种意义上,接口与抽象类非常相似。 3.6.3 接口的实现声明接口之后,类就可以通过继承接口来实现其中的抽象方法。继承接口的语法同类的继承类似,使用冒号“:”,将待继承的接口放在类的后面。如果继承于多个接口,使用逗号将其分隔。下面的代码使用Rectangle类来求一个矩形的面积:1.Rectangle r=new Rectangle(3,5);2.Console.WriteLine(r.GetArea();/输出153.6.4 接口与抽象类接口和抽象类非常相似,它定义了一些未实现的属性和方法。所有继承它的类都继承这些成员,在这个角度上,可以把接口理解为一个类的模板。接口和抽象类的相似之
11、处表现在以下两方面:(1)两者都包含可以由子类继承的抽象成员;(2)两者都不能直接实例化。3.7 方 法方法属于类的成员之一,用于执行计算或者其他的行为。在本节中将讲述如何声明方法、方法的参数以及方法的重载等。3.7.1 方法的声明方法声明的一般格式如下:method-header method-body其中,method-header是方法头部,定义method-header的格式如下:attributes method-modifiers return-type member-name(formal-parameter-list)其中,method-modifiers是修饰符,可以是下面的
12、几种:new、public、protected、internal、private、static、virtual、override、abstract和extern。3.7.2 参数方法的参数是调用方法时传递给它的变量,主要分为两类:(1)传递数据的值:直接把变量的数据值传递给方法;(2)传递数据的地址:把变量的内存地址传递给方法。 调用该方法如下:1.Student s=new Student(张三,20);2.s.SetHobby(游泳,篮球,足球); 如果不使用params方法,也可以使用数组来实现同样的功能。3.7.3 静态方法静态方法用于表示类所具有的行为,而非其对象所具有的行为。例如,
13、学生分班这项任务,就是全体学生集体的事情。静态方法通过在定义中使用static关键字来声明,static关键字放在修饰符和方法返回的数据类型之前,格式如下:method-modifier static return-type method-name(parameter-list).;3.7.4 方法的重载有时候,对于类需要完成的同一个功能的要求可能比较复杂。例如,对学生类而言,如果想要使其具有一个“成长”方法,但是这个方法,可能使其增长一岁,也可能增加指定的岁数,该怎么解决这个问题呢?C#使用重载技术来完成这个功能。重载是指允许存在多个同名函数,而这些函数的参数不同(或许参数个数不同,或许参数
14、类型不同,或许两者都不同)。3.7.5 操作符的重载上面介绍了方法的重载,C#还提供了重载机制:允许重载运算符,如“+”,“”等,在原来功能的基础上,完成用户自定义的功能。例如,对于复数运算,可以定义方法:Add(1+2i,2+3i)=3+5i而使用符号看起来会更简洁:(1+2i)+(2+3i)=3+5i 3.8 继承和多态继承和多态是面向对象思想的两个主要的特征。本节讲述怎样理解类的继承和多态,以及继承和多态的使用。3.8.1 继承继承的本质是代码重用。当要构造一个新的类时,通常无需从零开始。例如,在学生类的基础上,建立一个“大学生”类。很明显,“大学生”这个类具有自己的特点,如“所在系”就
15、并不是所有的学生都有的,而是大学生的特殊性质。可以把大学生看作是学生的一种延续,既在继承了学生的属性和方法基础之上,又包含了新的属性或方法。在构造大学生这个类时,只需在学生类的基础上添加大学生特有的特性即可,而无需从零开始,这时,称学生类为父类,大学生类为子类。3.8.2 多态继续上一节给出的例子,现在假设一个运动员总教练,手下有篮球、足球、游泳运动员。把他们召集起来之后,如果总教练只是简单地对他们说:“去训练!”,那么他们会怎样做呢?很自然,不同的运动员会去做不同的训练。对于总教练而言,只需要告诉他们统一的指令即可。在面向对象的思想中,这称为多态(Polymorphism)。3.9 小结本章主要讲述了C#的面向对象设计。其中重点讲解了几个基本的概念,包括对象、类、抽象类、接口和方法。通过本章的学习,应该初步理解C#面向对象的设计方法,学会如何使用面向对象的设计方法进行软件程序的设计。