面向对象编程基础_第1页
面向对象编程基础_第2页
面向对象编程基础_第3页
面向对象编程基础_第4页
面向对象编程基础_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第5章 面向对象编程基础 教学目标 面向对象程序设计(Object Oriented Programming,简称OOP)最早是在C+中使用的先进程序设计方法,它尽可能地模拟人类习惯的思维方式,使开发软件的方法和过程尽可能地接近人类认识世界、解决问题的方法与过程。采用面向对象的程序分析和设计技术开发的软件系统,稳定性、可重用性和可维护性都很好。本书前面介绍了C#语法和编程的所有基础知识。但是,要了解C#语言和.NET Framework的强大功能,还需要使用OOP技术。本章首先介绍OOP的基础知识,进而引导读者踏入面向对象程序设计的殿堂教学重点面向对象编程接口与继承多态性运算符重载引用类型和值

2、类型面向对象概述 面向对象编程是创建计算机应用程序的一种较新的方法,它解决了所谓的传统编程技巧带来的问题。 在客观世界中,可以把具有相似特征的事物归为一类,也就是把具有相同属性的对象看成一个类(class)。比如,所有的汽车可以归成一个“汽车类”,所有的人可以归成一个“人类”。在面向对象的程序设计中,“类”就是对具有相同属性和相同操作的一组对象的定义。从另一个角度来看,对象就是类的一个实例。 OOP相关的概念 类和对象静态成员对象的生命周期继承接口多态性对象之间的关系运算符重载引用类型和值类型类和对象(1)类是面向对象程序设计的基本构成模块。从定义来讲,类是一种数据结构,这种数据结构可能包含数

3、据程序、函数成员以及其它的嵌套类型。数据成员类型有常量、域和事件;函数成员类型有方法、属性、索引指示器、操作符、构造函数和析构函数 对象是从类型中创建的,就像前面的变量一样。对象的类型在OOP中有一个特殊的名称:类 对象是OOP应用程序的一个组成部件。这个组成部件封装了部分应用程序,这部分程序可以是一个过程、一些数据或一些更抽象的实体 类和对象(2)字段是一个代表和某对象或类相关的变量的成员属性是提供对对象或类的特性进行访问的成员方法是一个执行可以由对象或类完成的计算或行为的成员 事件是使得对像和类提供通知的成员 静态成员 静态成员可以在类的实例之间共享,所以可以将它们看作是类的全局对象。静态

4、属性和静态字段可以访问独立于任何对象实例的数据,静态方法可以执行与对象类型相关、但与对象实例无关的命令。在使用静态成员时,甚至不需要实例化对象 对象的生命周期 每个对象都一个明确定义的生命周期,除了“正在使用”的正常状态之外,还有两个重要的阶段:构造阶段:对象最初被创建并实例化的时期。这个初始化过程称为构造阶段,由构造函数来完成。析构阶段:在删除一个对象时,常常需要执行一些清理工作,释放对象占有的资源,这由析构函数来完成。继承 继承是OOP最重要的特性之一。任何类都可以从另一个类中继承,被继承(也称为派生)的类称为父类(也称为基类),派生出的类成为子类,子类拥有父类的所有成员 继承是传递的。如

5、果C从B派生,并且B从A派生,那么C继承在B中声明的成员同时也继承在A中声明的成员。一个派生类扩展它的直接基类。一个派生类可以添加同它继承的成员一样的新成员,但是不能去掉一个继承的成员的定义。构造函数和析构函数不能被继承。一个派生类可以通过用相同的名称或声明一个新的成员的方法隐藏继承的成员。一个类的实例包含在类和它的基类中声明的所有实例域的备份,并且存在一个从继承类类型到任何基类类型的隐式转换。一个类可以声明虚拟方法、属性和索引,并且派生类可以覆盖这些功能成员的执行。这使得类可以展示多态行为,此行为被功能成员调用实现,而这个调用要根据实例的运行时类型,通过这个类型,方法成员被调用。接口 接口就

6、是把隐式公共方法和属性组合起来,以封装特定功能的一个集合。一个接口定义了一个协议。一个实现了接口的类或结构必须符合它的协议。一个接口可以从多个基本接口继承,而一个类或结构也可以实现多个接口。 C# 中一个比较特殊的接口是IDisposable,支持IDisposable接口的对象必须实现其Dispose()方法,该方法的主要作用是,当不再需要某个对象时,就调用这个方法,释放重要的资源,否则,该资源会等到对垃圾回收调用析构函数时才释放 多态性 继承的一个结果是使得派生类在方法和属性上有一定的重叠,因此,可以使用相同的语法处理从同一个基类实例化的对象。而多态性则更推进了一步,它可以把某个派生类型的

7、变量赋值给其基类类型的变量接口也可以使用多态性,尽管不能像对象那样实例化接口,但可以建立接口类型的变量,然后就可以在支持该接口的对象上,使用这个变量访问该接口提供的方法和属性 对象之间的关系 包含关系:一个类包含另一个类。这类似于继承关系,但包含类可以控制对被包含类的成员的访问,甚至在使用被包含类的成员前进行其他处理。集合关系:一个类用作另一个类的多个实例的容器。这类似于对象数组,但集合有其他功能,包括索引、排序、重新设置大小等。 运算符重载 运算符重载是指通过函数重载使得我们可以对类的对象实例使用标准的运算符 运算符重载非常有用,因为我们可以在运算符重载中执行需要的任何操作。要重载运算符,需

8、要给类添加运算符类型成员(它们必须是static)。一些运算符有多种用途,(例如运算符就有一元和二元两种功能),因此我们还指定了要处理多少个操作数,以及这些操作数的类型 引用类型和值类型 值类型变量在内存的栈中存储它们自己和它们的内容。引用类型变量在内存的堆中存储一个引用,而在另一个地方存储内容。实际上,在使用C#时,不必过多地考虑这个问题。因为在使用时,值类型变量和引用类型变量的使用方式基本上完全相同。值类型和引用类型的一个主要区别是,值类型总是包含一个值,而引用类型可以是null,表示它们不包含值。但是,可以使用可空类型(这是泛型的一种形式)创建一个值类型,使值类型在这个方面的行为方式类似

9、于引用类型(即可以为null)。VS 2005中的OOP工具 “类视图”窗口除了可以查看类的结构信息之外,还可以访问许多项的相关代码 对象浏览器该窗口显示了与“类视图”窗口相同的信息,另外还显示了.NET类型的其他信息 添加新类选择“项目”|“添加类”菜单命令 生成UML类图 在主窗口中选择Program.cs文件,然后单击“解决方案资源管理器”工具栏中的“查看类关系图”按钮 定义C#类 类的声明抽象类密封类类基础规范基类接口列表类主体类的声明(1)类声明的组成如下:一系列可选的属性,跟着一系列可选的类修饰符,关键词class和一个作为类名的标识符,跟着一个可选的类的基本说明,然后是一对定义的

10、类的主体,还可以跟一个可选的分号 修 饰 符含 义无或internal类只能在当前项目中访问public类可以在任何地方访问abstract 或internal abstract类只能在当前项目中访问,不能实例化,只能继承public abstract类可以在任何地方访问,不能实例化,只能继承sealed或internal sealed类只能在当前项目中访问,不能派生,只能实例化public sealed类可以在任何地方访问,不能派生,只能实例化new只允许出现在嵌套类中,指定了一个类通过相同的名称隐藏了一个继承的成员类的声明(2)修饰符abstract用来声明类为抽象类,抽象类不能被实例化,

11、而只能派生新类。抽象类与非抽象类相比有如下不同点:抽象类不能被实例化,在一个抽象类上使用new操作符是错误的。当然可以有编译时类型为抽象的变量和数值,这样的变量和数值必须或者为null或者包含对从抽象类型派生的非抽象类的实例的引用。抽象类可以(但是不需要)包含抽象成员。抽象类不能是密封的。sealed修饰符用来声明一个密封类,一旦在类的声明时使用了sealed修饰符,就不能从这个类派生新类了。封装类不能是任何抽象类,sealed修饰符主要用于防止非计划的派生,但是它也使得某些运行时的优化成为可能。 类基础规范 类基础规范是指在类声明时,可能会定义了类的直接基本类和由类实现的接口。它跟在类名后面

12、,由冒号和基类名和(或)接口列表组成,一个类的直接基类只能有一个,但可以实现多个接口,可以同时有基类和接口列表,基类名和接口名之间用逗号分隔 如果类基础规范包括一个接口类型的列表,那么,就称该类实现了给定的接口类型。如果指定了基类,则基类必须紧跟在冒号的后面,之后才是接口列表 类主体 类的主体定义了类的成员,并用一对括起来。类的成员可以分为下面的几种:构造函数:又可分为实例构造函数和静态构造函数,前者执行需要对类的实例进行初始化的动作;后者则执行对类本身进行初始化的动作。析构函数:执行在类的实例要被永远丢弃前要实现的动作,释放对象占用的资源。字段:包括与类相关的常数数据和变量。方法:实现了可以

13、被类实现的计算和行为。属性:定义了命名的属性和与对这个属性进行读写的相关行为。事件:定义了由类产生的公告。索引:它允许类的实例通过与数组相同的方法来索引。操作符:它定义了可以被应用于类的实例上的表达式操作符。类型:它代表位于类中的类型。类成员 类成员声明必须遵循下面的规则:构造函数和析构函数必须与类名相同,所有其他的成员必须与类名不同。字段、事件或类型的名称必须在类声明中是唯一的,即不能与其他成员的名称相同。方法的名称必须与同一个类中声明的其他非方法的名称不同。索引的签名必须与同一个类中声明的所有其他索引的名称不同。操作符的签名必须与同一个类中声明的所有其他操作符的签名不同。构造函数和析构函数

14、 如果一个类不包含任何构造函数声明,就会自动提供一个默认的构造函数。默认的构造函数通常是下面的形式public MyClass(): base() 这里MyClass是类的名称。默认构造函数通过base()完全调用直接基类的无参数构造函数。 构造函数的执行顺序为了实例化派生的类,必须实例化它的基类。而要实例化它的基类,又必须实例化这个基类的基类,这样一直到实例化System.Object为止。结果是无论使用什么构造函数实例化类,总是要先调用System.Object.Object()。构造函数也可以带有访问关键字,前面定义的构造函数都是公有的,但是private和protected的构造函数也

15、有各自的作用 类的析构函数由带有前缀的类名(与构造函数的相同)来声明。当进行垃圾回收时,就执行析构函数中的代码,释放资源 类可以有一个静态构造函数,它只能被运行时代码所使用,而且不能带有访问修饰符 定义字段 字段的声明可能包括属性集合、一个new修饰符、4个访问修饰符的有效组合、一个静态修饰符和一个readonly修饰符等。字段声明的类型指定了被声明引入的成员的类型。这个类型后面跟着一个变量声明符列表,其中的每一个变量声明符将引入一个新成员。变量声明符又包括一个为成员命名的标识符和一个可选的“=”符号和一个给出变量的初始数值的变量初始化程序静态字段可以通过定义它们的类来访问 可以使用关键字co

16、nst来创建一个常量 定义方法 方法声明可以包含一系列属性,一个new修饰符,4个访问修饰符的一种有效组合,static、virtual、override或abstract修饰符中的一个,和一个extern修饰符。方法声明的返回类型指定了该方法计算并返回的数据的类型。如果方法不返回任何数值,那么返回类型就是void 对于抽象和外部的方法,方法主体简单地由分号组成。对于其他方法,方法主体由指定在方法被调用时执行的语句组成 定义属性 属性的声明方式与字段类似,但包含的内容更多,因为它们在修改之前还要执行一些额外的操作。属性声明可以包含一个new 修饰符,四个访问修饰符的有效组合和static、 v

17、irtual、override或abstract修饰符中的一个 属性拥有两个类似于函数的块:一个块用于获取属性的值;另一个块用于设置属性的值。这两个块也称为访问器,分别用get和set关键字来定义,可以用于控制对属性的访问级别 使用类图添加成员 选择“视图”|“其他窗口”|“类详细信息”菜单命令,打开“类详细信息”窗口在“类详细信息”窗口中的文本框中输入方法名称,就可以把一个方法添加到当前类中。然后就可以依次设置方法的返回值类型、方法的可访问性、摘要信息、是否在类图中隐藏等。添加属性的方式与添加方法类似 添加字段的方式很简单,只需输入字段的名称,选择类型和访问修饰符即可。 本 章 小 结 本章介绍了面向对象编程的基础知识。包括面向对象编程的思想,OOP相关的概念,对象声明周期等,最后又介绍了VS 2005中的OOP工具,利用这些工具可以快速完成很多工作,而无须编写大量的代码。通过本章的学习,使读者对OOP有一定的理解和认识,并能自己编写简单的C# 类,为深入

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论