ASP.NET程序设计(高职计算机专业系列教材)第四章 C#面向对象编程.ppt
第四章C#面向对象编程,4.1 类、对象和实例4.2 类的数据成员4.3 类的函数成员4.4 继承和接口4.5 命名空间4.6 常见C#类操作实例,本章教学要求:,本章主要学习类、对象和实例,以及类的数据成员和函数成员、继承和接口的定义和实现以及命名空间的概念及使用。这些以及上一章的委托和事件的定义及实现将为全书后续章节的学习奠定良好的基础。,第四章C#面向对象编程,C#是Microsoft公司为.NET量身定做的最好的编程语言,C#语言具有面向对象编程语言的所有特性,如封装、继承、多态等。,4.1 类、对象和实例,4.1.1 一个简单的C#类程序C#程序的开发方式通常有两种:一种是使用Visual Studio.NET提供的集成开发环境IDE进行开发。,上机步骤为:(1)进入VS.NET提供的集成开发环境IDE/选择“文件”/“新建”/“项目”菜单项/打开“新建项目”对话框/“项目类型”选为“Visual C#项目”;“模板”选择“控制台应用程序”/修改项目所在的目录位置,并给项目命名(如AAA)。(2)编辑用户类名.CS文件(作法是将下面例4.1-4.7中所给代码全部替换原先自动生成的代码)/存盘/在解决方案资源管理器中右击AAA项目,然后单击“设为启动项目”。(3)在“调试”菜单上,单击“开始执行(不调试)”。即可看到运行结果的黑色屏幕输出。,另一种是使用文本编辑器编写C#程序代码,然后以.cs为扩展名保存源文件,并用命令行编辑器程序csc.exe进行编译。于是,C#编译器在类文件*.cs所在的目录下就会生成了一个.exe文件。运行这个.exe文件,并完成人机对话操作就会输出程序的运行结果。,注意:C#开发程序的两种方式在本章均可采用,由于篇幅所限,本章主要用第二种即文本编辑器方式介绍,而第一种即控制台方式也可自行上机采用。,例4.1创建一个小对话程序。using System;/用来导入命名空间(Namespace)以表明类的层次关系。class MyFirstApp public static void Main()Console.WriteLine(您的用户名是什么?);string user=Console.ReadLine();Console.WriteLine(hello,0,欢迎您学会使用!,user);/*WriteLine()方法的参数表中紧随串后的第一个参数将替换0,依次类推,还可使用1,2等参数替换串后的第二、三个参数等。*/,小提示:语法注意点:Main()是程序的入口点,每个程序都必须包含一个Main()方法。C#用“;”作为语句的分隔符。C#程序可以采用单行注释符“/”标注,或多行注释符“/*”和“*/”标注。C#程序的输入输出通过Console来实现。Console是System名字空间下的一个类。在屏幕上输出一个字符串用Console.WriteLine(),接受输入设备的输入用Console.ReadLine()方法。,执行步骤如下:(1)在记事本中编写如下所示的两个C#程序之一,保存名为LT4-1.CS,并将该文件存放在C:Inetpubwwwroot(即IIS默认的Web站点目录)中。(2)用编译器CSC编译程序。.NET框架内置了C#编辑器,可以在命令窗口编译C#文件(单击“开始”/“所有程序”/“Microsoft Visual Studio.NET 2003”/“Visual Studio.NET工具”/“Visual Studio.NET 2003命令提示”,打开命令窗口)。进入LT4-1.CS文件的保存目录(CDInetpubwwwrootasp_netch4,本章例子都在此存放),在命令行中输入:CSC LT4-1.CS 显示如图4.1所示。编译成功后,则在LT4-1.CS文件所在目录下产生可执行文件LT4-1.exe。在当前命令窗口中输入LT4-1后运行程序,人机对话输入名字,回车后的运行结果如图4.2所示。,图4.2 LT4-1.exe的运行结果,图4.1 用CSC编译LT4-1.CS文件,4.1.2 类、对象和实例对象:是一个自包含的实体,用一组可识别的特性和行为来标识,通俗地说对象是一个可以区别的存在.类:是对象的模板,定义了对象的特性。类的定义格式为:属性 类修饰符 class 类名类体类实例:是一个真实的对象.,在OOP中,下面的术语用于描述对象的特性:属性:是一个名词,描述对象的某种特性。方法:是一个动词,描述了对象可以完成的工作,或希望它完成的工作。事件:也是一个动词,描述了对象为响应某个动作而执行的操作。在前面类定义的基础上,就可以通过new运算符来创建类的实例(即对象),类实例就是类类型变量,其创建格式为:类名 变量名=new 类名(参数);,例如:Student p=new Student(“王兰”,20,200501);或:Student p;p=new Student(“王兰”,20,200501);/*表明定义了类Student的实例p,该实例的三个数据成员name、age和ID值分别为:“王兰”,20,200501*/例4.2 定义一个名称为Student的类,其中含有三个私有(private)数据成员:name,age,ID;两个公有(public)函数成员display和Student。,类成员包括函数成员和数据成员。数据成员:包含类要处理的数据,它包括常数和字段。函数成员:可以包含可执行代码的成员统称为该类的函数成员,一个类的函数成员包括:方法、属性、事件、运算符、实例构造函数、析构函数和静态构造函数等。在程序中,对类的成员的访问要使用点“.”运算符完成。,4.2 类的数据成员,1类成员访问修饰符类成员访问修饰符用于指定类成员的可访问性。C#共有public、private、protected和internal四个类成员访问修饰符。其功能比较如下表4-1。表4-1类成员访问修饰符功能比较表,2静态成员和实例成员 类的成员要么是静态成员,要么是实例成员。当用static修饰符定义成员时,得到静态成员,静态成员属于类,为这个类的所有实例所共享;而不用static修饰符定义的成员,称为实例成员,实例成员属于类的实例。例4.3 定义一个Person类,其中含有一个静态成员count表示班级中学生人数,一个实例成员number表示学生学号。,3字段与属性(1)字段是类中声明的一种数据成员,即与对象或类相关联的变量。根据在类中定义字段时所用到的修饰符的不同,可将字段分为:静态字段、实例字段和只读字段。其中静态字段与实例字段的含义与前面介绍的静态成员与实例成员的含义一致。表4-2 三类字段功能比较表,小提示:构造函数是类的特殊函数成员,它主要用于为对象分配空间,完成对象的初始化工作。其详细情况在4.3节介绍。,例4.4 字段的声明与使用(2)属性用于刻画对象的特征或表示对象的状态。属性与字段不同,它不表示存储位置。相反,属性有访问器,访问器用来指定在它们的值被读取或写入时需要执行的语句。所以,属性提供了一种机制,它把读取和写入对象的某些特性与一些操作关联起来。给属性赋值时使用set访问器,set访问器始终使用value关键字设置属性值。而获取属性值时使用get访问器,get访问器通过return返回属性的值。在访问声明中,如果只有get访问器,表示是只读属性;如果只有set访问器,表示是只写属性;如果get访问器和set访问器都有,表示读写属性。,小技巧:C#中利用命令行编辑器程序csc.exe调试程序的方法和C/C+语言中利用Turbo C/C+调试程序的方法相似,即排除一个个小错误后,直到程序运行全通过为止。,例4.5 属性的声明与使用,小提示:get和set访问器的首字母不能大写,否则上机显示出错信息。,4.3 类的函数成员,1、构造函数和析构函数构造函数是类的特殊函数成员,它主要用于为对象分配空间,完成对象的初始化工作。它具有以下特点:构造函数的名称与类的名称相同。构造函数可以具有参数,但没有返回值。构造函数在对象定义(即创建对象)时自动被调用。在类中没有定义该类的构造函数时,则编译系统会自动生成一个默认的构造函数。该函数是一个不带参数、函数体为空的函数。构造函数可以重载,但不能继承。,构造函数可分为两类:实例构造函数和静态构造函数。析构函数是也是类的特殊函数成员,它的主要作用是释放类的实例(即对象)分配空间。它具有以下特点:析构函数的名称与类名相同,但其名称前加一“”符号。析构函数不能带有参数,也没有返回值。当撤消对象时,系统自动调用析构函数。析构函数不能被重载,也不能被继承。,2类的方法 方法是表现类或对象行为的函数成员.类中方法的声明格式如下:属性集 方法修饰符 返回值类型 方法名(形参列表)方法体其中,方法修饰符包括:new、public、protected、private、internal、static virtual、abstract、sealed、override和extern。用修饰符static定义方法时,表示该方法为静态方法;而未用修饰符static定义的方法为实例方法。,静态方法不对特定实例进行操作,不与实例相关联,它属于类,并仅与类相关联,所以调用静态方法不需要创建类实例。要调用类的静态方法,只需要类名和方法名,中间加上“.”运算符即可。静态方法只能访问类的静态成员(访问非静态成员是错误的)。实例方法属于类的实例,可对类的某个特定实例进行操作,调用实例方法需要通过类的实例,其使用格式为“实例名.方法名”,实例方法可以访问类中的任何成员。例4.6 使用静态方法和实例方法,4.4.1 类的继承、派生、多态性 只所以要使用面向对象的编程思想实现ASP.NET程序设计,可以用四个简单的术语来解释:抽象、封装、多态性、继承。,抽象:是隐藏复杂性、类的内部工作细节的过程,以使用户不必知道它的运作方式。封装:每个对象都包含它能进行操作所需要的所有信息,这个特性称为封装。因此对象不必依赖其它对象来完成自己的操作,然而封装并不表示在类中包含了所需要的所有内容。多态性:用于表示不同的对象可以执行相同的动作,但要通过它们自己的实现代码来执行。所以多态性可实现“一个接口,多种方法”。继承:它定义了类如何相互关联,共享特性。继承的工作方式是,定义类和子类,其中子类不仅继承了父类的所有特性,还可以定义新的特性。一般称被继承的类为基类或父类,而称继承后产生的类为派生类或子类。,4.4 继承和接口,C#中继承有如下重要特性:只允许单继承,即派生类只能有一个基类。继承是可以传递的,如果类C从类B派生,而类B从类A派生,那么类C既继承在类B中声明的成员,又继承在类A中声明的成员。派生类能扩展它的直接基类,即派生类可以添加新的成员,但不能删除从基类继承的成员。基类的构造函数和析构函数不能被派生类继承。派生类可以隐藏基类的成员,如果在派生类中声明了与基类同名的新成员时,基类中的该成员在派生类中就不能访问到。1.派生类的声明:派生类的声明格式为:属性 类修饰符 class 类名:基类类体,小提示:在派生类的声明中,通过在类名的后面加上“:”和基类的名称一起表示继承。派生类的声明中的规定同一般类的声明规定相同。,2.base关键字用于从派生类中访问基类的成员,其用法如下:指定创建派生类实例时应调用的基类构造函数,以完成对基类成员的初始化工作。在派生类中访问基类的成员。3.多态性C#中支持两种类型的多态性:编译时的多态性:是在程序编译时就决定如何实现某一动作,它通过方法重载和运算符重载实现。编译时的多态性在编译时就知道调用方法的全部信息。运行时多态性:是在运行时动态实现某一动作,它通过继承和虚成员实现。,4.虚方法:对于类中的方法(即函数成员),若声明时加上virtual修饰符,则称该方法为虚方法。virtual修饰符不能与修饰符static、abstract和override一起使用。虚方法重载时要求方法名称、方法参数类型、方法参数、方法参数顺序及方法返回值类型都必须与基类中的虚方法完全一样。在派生类中重载方法时,要加上override修饰符。,例4.7 定义一个类Person,含有姓名Name、年令Age、肤色Color;定义其构造函数完成对其3个数据成员的初始化;定义函数成员display能完成输出其3个数据成员的功能,并将其定义为虚函数;定义函数成员print输出“这是在Person类中”信息。再定义第二个类Employee,它是以Person类为基类的派生类,其中含有两个数据成员所在部门名称depa_name和工资salary;定义其构造函数除完成自己的数据成员初始化外,还利用base关键字调用基类Person的构造函数完成对从基类继承过来的数据成员的初始化;在Employee类中重载display函数,完成对其数据成员的输出功能;定义函数成员print输出“这是在Employee类中”信息。,4.4.2 抽象类、密封类、object类和string类1抽象类 抽象类表示一种抽象的概念,用来为它的派生类提供一个公共接口。在声明一个类时加上abstract修饰符时就表示声明该类为抽象类。抽象类只能其它类的基类,不能用该类定义对象,即不能实例化。2密封类在声明一个类时,加上sealed修饰符时就表示该类为密封类。密封类与抽象类是互斥的,因此修饰符abstract与sealed不能同时使用。3object类和string类object类和string类是在C#编程中经常用到的两个类。(1)object类 object类是预定义类System.object的别名,object类是所有其它类型的基类。在C#中,所有类型都是直接或间接地从object类型中派生而来的。因此,一个object类的变量可以赋予任何类型的值。例如:,int i=6;object obj1=i;object obj2=true;object obj3=b;(2)string类string类型专门用于对字符串的操作,它是预定义类System.string的别名。如:string a=How are you;string str1=mikecat;4.4.3 接口,提醒:为什么接口非常有用?在开发大型应用程序时,可能有一组类都需要执行某个相似的动作。接口允许指定这个相似的动作是什么,但不定义它是如何实现的。这与继承不同,继承的实现方式是基类级的。,接口是类的一种特殊类型。它也是一组抽象的方法,用来定义类型与使用该类型的用户之间的协定。一个接口可以从多个基接口继承,而一个类或结构可以实现多个接口。接口和类一样,可以有方法、属性和事件等成员。但与类不同的是,接口仅仅提供成员的声明,并不提供成员的实现。接口成员可以在具体的类或结构代码中实现。因此,一个接口定义一个协定,实现接口的类或结构必须遵守其协定。1.接口的定义:接口定义格式为:属性接口修饰符 interface 接口名:基接口接口体其中,关键字interface、接口名和接口体是必需项,其它项是可选项。接口修饰符包括:new、public、protected、internal、private。接口体用于定义接口的成员。如:Interface Secret/定义接口类型Secretvoid Encrypt();void Unencrypt();,接口支持多继承。在接口名后可以列举一个或多个继承接口,相互之间以“,”号分隔。例如:Interface Secret1:Secret/接口Secret1继承Secret2.接口的实现 当希望类成员展示某些特性时,可以将这些成员分组在接口中,然后在类或结构中实现。例4.8:创建一个接口并实现接口。,小提示:“接口”的添加方式同“类”的添加方式一样,因为接口是类的一种特殊类型。具体作法是:在解决方案窗口,右击项目名称|添加|添加新项|类|更改类名分别为Animal.cs、Person.cs、Dog.cs。另:有关委托和事件概念及基本应用参考第三章。,命名空间(namespace)是C#中重要的一个部分。这里介绍命名空间(或名字空间)的概念,以及如何创建并使用命名空间?命名空间就是一个名字,它将相关的类归入到一个层次结构中,更好地组织类,避免命名冲突而且简化了使用。微软.NET框架类库中包含了80多个常用命名空间。例如,System.String是.NET String类型完整的资格名称。但是为了简化代码起见,只要声明正在使用System名称空间为:using System;,提醒:System 命名空间包含基本类和基类,这些类定义常用的值和引用数据类型、事件和事件处理程序、接口、属性和异常处理。更多的关于“System 命名空间”知识参阅VS.NET界面“帮助”菜单/“动态帮助”。,4.5 命名空间,1.namesapce关键字创建新的命名空间,可以使用namesapce关键字。格式如下:namesapce name.name1/name,name1是命名空间名type_declaratons/声明类型 通过使用namesapce关键字,我们还可以将C#程序或者类包裹在自身的名称空间中.2.using关键字 using 命令负责告诉C#编译器在System 库中寻找未知的类。格式如下:using 命名空间名;这样,在声明某个类型的实例时,直接用此类型的名称即可。,C#程序的常规结构:C#程序可由一个或多个文件组成。每个文件可包含一个或多个命名空间。一个命名空间除了可包含其他命名空间外,还可包含类、结构、接口、枚举、委托等类型。以下是 C#程序的主干,它包含所有这些元素。/一个C#程序的框架 using System;namespace MyNamespace1 class MyClass1 struct MyStruct interface IMyInterface delegate int MyDelegate();enum MyEnum namespace MyNamespace2 class MyClass2 public static void Main(string args),4.6 常见C#类操作实例,举例:例4.9 用Visual Studio.NET编写C#类库(Dll,即动态链接库)程序,并引用它实现两数加法运算。在Visual C#中,创建C#类库(Dll)程序是比较容易的。下面的介绍分成两部分:创建 DLL和在客户端测试 DLL。创建DLL1.创建C#类库(Dll)2增加一个方法3增加一个属性4向类中增加代码 5构造 dll,提醒:什么是 DLL?DLL 是一个包含可由多个程序同时使用的代码和数据的库。,图4-16 控制台应用程序执行结果窗口,在客户端测试 dll1、创建控制台应用程序 2、增加命名空间的引用3、调用Math命名空间 4.完整的项目文件ClientLT4_9的代码及其按照控制台应用程序方式执行的结果:,小结 本章主要以实例为导向介绍了类、对象和实例,以及类的数据成员和函数成员、继承和接口以及命名空间的概念及使用,最后还介绍了用Visual Studio.NET编写C#类库(Dll,即动态链接库)程序,并引用它实现加法运算的程序设计的完整过程。,1录入程序:例题任选3道,用下述两种方法分别验证程序的正确性,并描述其结果各显示什么样式。(1)用编译器CSC编译程序。(2)使用Visual Studio.NET提供的集成开发环境IDE进行开发。2参考例4.9,用Visual Studio.NET编写C#类库(Dll,即动态链接库)程序,并引用它实现两数乘法运算。习题4-1、4-2综合4-3,实训指导与习题,