《C#语言与面向对象的编程基础.ppt》由会员分享,可在线阅读,更多相关《C#语言与面向对象的编程基础.ppt(74页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、ASP.NET ASP.NET 网络应用程序开发网络应用程序开发计算机科学系 刘彦宾1/16/20231第第2章章C#语言与面向对象的编程基础语言与面向对象的编程基础2.1 C#2.1 C#程序的开程序的开发发2.2 2.2 数据数据类类型型2.3 2.3 运算符运算符 2.4 2.4 控制控制语语句句 2.5 2.5 命名空命名空间间 1/16/20232C#是微是微软软公司公司专门为专门为.NET量身量身订订制的新一代程序制的新一代程序开开发语发语言,它充分吸收了言,它充分吸收了过过去几十年中去几十年中计计算机科学算机科学发发展的展的经验经验教教训训,体,体现现了当前最新程序了当前最新程序
2、设计设计技技术术的功能的功能和精和精华华,从,从C#的身上可以看到的身上可以看到C+、VisualBasic、Dephi、Java等等语语言的很多言的很多优优点。点。C#最突出的特点是:最突出的特点是:现现代、代、简单简单、面向、面向对对象和象和类类型安全。型安全。1/16/20233使用使用C#开开发发基于基于.NET的的应应用程序,具有良好的安用程序,具有良好的安全性和跨平台性。全性和跨平台性。C#用途广泛,可以开用途广泛,可以开发发Windows、ASP.NET、Web服服务务,甚至是,甚至是Windows底底层层的各种不的各种不同同类类型的型的应应用程序。用程序。C#的程序可以通的程序
3、可以通过过XML交交换换数据数据信息。因信息。因为为XML是是纯纯文本的信息,文本的信息,这这就就为为通通过过C#开开发发的的应应用程序的跨平台性能提供了用程序的跨平台性能提供了强强大的保障。大的保障。C#的程的程序运行方式也是独特的,其序运行方式也是独特的,其应应用程序完全在用程序完全在.NET平台平台的管理下运行,的管理下运行,这这就大大地增加了就大大地增加了应应用程序的用程序的稳稳定性定性和安全性。和安全性。1/16/202342.1C#程序的开程序的开发发C#程序的开程序的开发发方式有两种:一种是使用方式有两种:一种是使用VisualStudio.NET提供的集成开提供的集成开发环发环
4、境境IDE进进行开行开发发;另一;另一种方式是使用文本种方式是使用文本编辑编辑器器编编写程序代写程序代码码,然后以,然后以.cs保保存源文件,并用命令行存源文件,并用命令行编辑编辑器(器(csc)进进行行编译编译。1/16/20235简单的欢迎程序usingSystem;namespaceConsoleApplication1classProgramstaticvoidMain(stringargs)Console.WriteLine(欢迎使用欢迎使用Csharp编程!编程!);“Main”方法和语句方法名“Main”作为保留字,是程序的起点。前面的static修饰符表明该方法仅仅在该特定的类
5、中工作,而不是在该类的实例中工作。这是必需的,因为一旦程序启动后,并不存在对象的实例。类 名称空间的声明名称空间的声明 1/16/20236在编写程序时需要注意以下几点:在编写程序时需要注意以下几点:与与C C和和C+C+相同,相同,C#C#对于大小写是敏感的。对于大小写是敏感的。Main()Main()是是程程序序的的入入口口点点,每每个个程程序序都都必必须须含含有有一一个个MainMain()()方法。方法。C#C#用分号作为分隔符来终止每条语句。用分号作为分隔符来终止每条语句。C#C#程程序序可可以以含含有有注注释释。单单行行注注释释使使用用“/”“/”标标注注,注注释释内内容容到到本本
6、行行结结束束为为止止。如如果果需需要要扩扩展展到到多多行行注注释释,将注释内容用将注释内容用“/*”“/*”和和“*/”“*/”括起来即可。括起来即可。1/16/20237usingSystem;namespaceConsoleApplication1classProgramstaticvoidMain(stringargs)Console.Write(Whatisyourname?:);Console.Write(Hello,0!,Console.ReadLine();Console.WriteLine(欢迎使用欢迎使用Csharp编程!编程!);/Write(.)与 WriteLine(.
7、)的区别是:Write(.)语句把信息输出到控制台,之后光标停留在同一行,而WriteLine(.)把信息输出,之后换行。1/16/20238整型布尔型字符型(整型的一种特殊情况)浮点型小数型 简单类型(简单类型(Simple types)结构类型(结构类型(struct types)枚举类型(枚举类型(Enumeration types)2.2 2.2 数据类型数据类型 C#C#语言的数据类型主要分为两类:值类型(语言的数据类型主要分为两类:值类型(Value Value TypeType)和引用类型()和引用类型(Reference TypeReference Type)。其中,值类)。其
8、中,值类型的变量直接存储它的数据内容,而引用类型的变量型的变量直接存储它的数据内容,而引用类型的变量存储的是对实际数据的引用。存储的是对实际数据的引用。C#C#的引用类型包括类类的引用类型包括类类型型(Class Type)(Class Type)、数组类型、数组类型(Array Type)(Array Type)、接口类型、接口类型(Interface Type)(Interface Type)和委托类型和委托类型(Delegate Type)(Delegate Type)。对象类型对象类型类类型类类型接口接口代表元代表元字符串类型字符串类型数组数组 引用类型引用类型值类型值类型1/16/2
9、02392.2.1值类型值类型值类型可以分为简单类型、结构类型和枚举类型。值类型可以分为简单类型、结构类型和枚举类型。1简单类型简单类型简单类型分整数类型、浮点类型、简单类型分整数类型、浮点类型、decimal类型和类型和bool类型。类型。1/16/202310简单类型:整型整型sbyte型为有符号型为有符号8位整数位整数byte型为无符号型为无符号16位整数位整数short型为有符号型为有符号16位整数位整数ushort型为无符号型为无符号16位整数位整数int型为有符号型为有符号32位整数位整数uint型为无符号型为无符号32位整数位整数long型为型为64位有符号整数位有符号整数ulo
10、ng型为型为64位无符号整数位无符号整数char字符型为一个单字符型为一个单Unicode字符,字符,16位长位长注意:在注意:在C中,中,int不再取决于一个机器的字(不再取决于一个机器的字(word)的大小,而的大小,而long被设成被设成64位。位。1/16/202311简单类型:浮点型浮点型float:取值范围在取值范围在1.5x10-453.4x1038之间,之间,精度为精度为7位数。位数。double:取值范围在取值范围在5.0 x10-3241.7x10308之间,之间,精度为精度为1516位位数。数。1/16/202312简单类型:小数型小数型小数型是一种高精度、小数型是一种高
11、精度、128位数据类型,它打算位数据类型,它打算用于金融和货币的计算。用于金融和货币的计算。当定义一个变量并赋值给它时,使用当定义一个变量并赋值给它时,使用m后缀以表后缀以表明它是一个小数型:明它是一个小数型:decimaldecMyValue=1.0m;如果省略了如果省略了m,在变量被赋值之前,它将被编,在变量被赋值之前,它将被编译器认作译器认作double型。型。1/16/202313结构类型结构类型2结构类型结构类型结构类型是一种复合数据类型,用于将多个不同类结构类型是一种复合数据类型,用于将多个不同类型的成员组合为一种新的类型。结构的声明使用型的成员组合为一种新的类型。结构的声明使用s
12、truct关键字。关键字。如下所示:如下所示:1/16/202314structStudent/定义结构类型定义结构类型Studentpublicstringid;publicstringname;publicintage;publicstringclassname;publicstringtelephone;创建结构实例的过程和创建类实例相似,例如:创建结构实例的过程和创建类实例相似,例如:Studentstu=newStudent();对结构的成员的访问使用点运算符。例如:对结构的成员的访问使用点运算符。例如:stu.age=20;1/16/202315在在C#中,结构和类的区别在于结构是
13、一个中,结构和类的区别在于结构是一个值类型,而类是一个引用类型。值类型,而类是一个引用类型。使用结构的主要思想是用于创建小型的对使用结构的主要思想是用于创建小型的对象,可以节省内存,因为没有如类对象象,可以节省内存,因为没有如类对象所需的那样有额外的引用产生。所需的那样有额外的引用产生。1/16/2023161:usingSystem;2:3:structIP4:5:publicbyteb1,b2,b3,b4;6:7:8:classTest9:10:publicstaticvoidMain()11:12:IPmyIP=newIP;13:myIP.b1=192;14:myIP.b2=168;15
14、:myIP.b3=1;16:myIP.b4=101;17:Console.Write(0.1.,myIP.b1,myIP.b2);18:Console.Write(0.1,myIP.b3,myIP.b4);19:1/16/2023173枚举类型枚举类型枚举类型是一组逻辑上密不可分的整数值。枚举的枚举类型是一组逻辑上密不可分的整数值。枚举的声明使用声明使用Enum关键字。例如:关键字。例如:enumWeekday/定义枚举类型定义枚举类型weekdaySunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday在在枚枚举举类类型型中中,第第一一
15、个个枚枚举举数数的的默默认认值值为为0,后后面面每每个个值值依依次次递递增增1。当当然然,也也可可以以使使用用赋赋值值语语句句显显式式地地为枚举中的常量赋值。访问枚举需要使用点运算符。为枚举中的常量赋值。访问枚举需要使用点运算符。1/16/2023182.2.2类类类是面向对象编程的基本构造块,是一种包含数据类是面向对象编程的基本构造块,是一种包含数据成员、函数成员和嵌套类型的数据结构。类的数据成成员、函数成员和嵌套类型的数据结构。类的数据成员有常量、域和事件。函数成员包括方法、属性、操员有常量、域和事件。函数成员包括方法、属性、操作符、构造函数和析构函数。类支持继承机制,通过作符、构造函数和
16、析构函数。类支持继承机制,通过继承、派生可以扩展类的数据成员和函数方法,进而继承、派生可以扩展类的数据成员和函数方法,进而达到代码重用和设计重用的目的。达到代码重用和设计重用的目的。1/16/2023191.类的定义格式为:类的定义格式为:属性属性类修饰符类修饰符class类名类名类体类体其中,类修饰符包括:其中,类修饰符包括:new、abstract、sealed、public、protected、internal、private。类体用于定义。类体用于定义类的成员,类的成员中可以包含数据成员和函数成员。类的成员,类的成员中可以包含数据成员和函数成员。1/16/2023202.创建类的实例创
17、建类的实例在在定定义义了了类类之之后后,就就可可以以通通过过new运运算算符符来来创创建建类类的的实实例例(即即对对象象),类类实实例例就就是是类类类类型型的的变变量量,其其创创建格式为:建格式为:类名类名实例名即变量名实例名即变量名=new类名类名(参数参数);实际上,类的实例的创建中,运算符实际上,类的实例的创建中,运算符new通过调用通过调用类的构造函数完成类的初始化工作。类的构造函数完成类的初始化工作。1/16/2023213.类的成员类的成员类类的的成成员员分分为为两两大大类类,类类本本身身定定义义的的成成员员和和从从基基类类继继承承来来的的成成员员。类类成成员员包包括括函函数数成成
18、员员和和数数据据成成员员。可可以以包包含含可可执执行行代代码码的的成成员员统统称称为为该该类类的的函函数数成成员员,一一个个类类的的函函数数成成员员包包括括:方方法法、属属性性、事事件件、索索引引器器、运运算算符符、实实例例构构造造函函数数、析析构构函函数数和和静静态态构构造造函函数数。数据成员包含类要处理的数据,它包括常数和字段。数据成员包含类要处理的数据,它包括常数和字段。在程序中,对类的成员的访问要使用点运算符在程序中,对类的成员的访问要使用点运算符“.”完成。完成。1/16/202322(1)类成员访问修饰符类成员访问修饰符类成员访问修饰符用于指定类成员的可访问性。类成员访问修饰符用于
19、指定类成员的可访问性。C#共有共有public、private、protected和和internal四个类成员四个类成员访问修饰符。访问修饰符。(2)静态成员与实例成员静态成员与实例成员类的成员要么是静态成员,要么是实例成员。当用类的成员要么是静态成员,要么是实例成员。当用static修饰符定义成员时,得到静态成员,静态成员属修饰符定义成员时,得到静态成员,静态成员属于类,为这个类的所有实例所共享;不用于类,为这个类的所有实例所共享;不用static修饰符修饰符定义的成员,称为实例成员,实例成员属于类的实例。定义的成员,称为实例成员,实例成员属于类的实例。1/16/2023234.构造函数和
20、析构函数构造函数和析构函数构构造造函函数数是是类类的的特特殊殊函函数数成成员员,它它主主要要用用于于为为对对象象分配空间,完成对象的初始化工作。具有以下特点:分配空间,完成对象的初始化工作。具有以下特点:构造函数的名称与类的名称相同。构造函数的名称与类的名称相同。构造函数可以具有参数,但没有返回值。构造函数可以具有参数,但没有返回值。构造函数在对象定义(即创建对象)时自动被调用。构造函数在对象定义(即创建对象)时自动被调用。在在类类中中没没有有定定义义该该类类的的构构造造函函数数时时,则则编编译译系系统统会会自自动动生生成成一一个个默默认认的的构构造造函函数数,该该函函数数是是一一个个不不带带
21、参参数数、函数体为空的函数。函数体为空的函数。构造函数可以重载,但不能继承。构造函数可以重载,但不能继承。构造函数可分为实例函数和静态构造函数。构造函数可分为实例函数和静态构造函数。1/16/202324 析析构构函函数数也也是是类类的的特特殊殊函函数数成成员员,它它的的主主要要作作用用是是释放类的实例,它具有以下特点:释放类的实例,它具有以下特点:析析构构函函数数的的名名字字与与类类名名相相同同,但但其其名名称称前前加加一一“”符号。符号。析构函数不能带参数,也没有返回值。析构函数不能带参数,也没有返回值。当撤消对象时,系统自动调用析构函数。当撤消对象时,系统自动调用析构函数。析构函数不能被
22、继承,也不能被重载。析构函数不能被继承,也不能被重载。1/16/202325 5.5.类的方法类的方法 方方法法是是表表现现类类或或对对象象行行为为的的函函数数成成员员。类类中中方方法法的的声明的格式如下:声明的格式如下:属性集属性集 方法修饰符方法修饰符 返回值类型返回值类型 方法名方法名(形参列表形参列表)方法体方法体 其中,方法的修饰符主要有:其中,方法的修饰符主要有:newnew、publicpublic、protectedprotected、internalinternal、privateprivate、staticstatic、virtualvirtual、sealedsealed
23、、overrideoverride、abstractabstract、externextern。1/16/202326 用用修修饰饰符符staticstatic定定义义方方法法时时,表表示示该该方方法法为为静静态态方法。未用修饰符方法。未用修饰符staticstatic定义的方法为实例方法。定义的方法为实例方法。静静态态方方法法不不对对特特定定实实例例进进行行操操作作,不不与与实实例例相相关关联联,它它属属于于类类,与与类类相相关关联联,所所以以调调用用静静态态方方法法不不需需要要创创建建类类实实例例。要要调调用用类类的的静静态态方方法法,只只需需要要类类名名和和方方法法名名,中中间间加加上上
24、圆圆点点“.”“.”运运算算符符即即可可。静静态态方方法法只只能访问类的静态成员,访问非静态成员是错误的。能访问类的静态成员,访问非静态成员是错误的。实例方法属于类的实例,可对类的某个特定实例实例方法属于类的实例,可对类的某个特定实例进行操作,调用实例方法需要通过类的实例,格式是进行操作,调用实例方法需要通过类的实例,格式是“实例名实例名.方法名方法名”,实例方法可以访问类中的任何成,实例方法可以访问类中的任何成员。员。1/16/2023276.6.字段与属性字段与属性(1)(1)字段字段 字字段段就就是是类类中中声声明明的的一一种种数数据据成成员员,即即与与对对象象或或类类相相关关联联的的变
25、变量量。根根据据在在类类中中定定义义字字段段时时所所用用到到的的修修饰饰符符的的不不同同,可可将将字字段段分分为为:静静态态字字段段、实实例例字字段段、只只读字段。读字段。1/16/202328 静静态态字字段段:用用staticstatic修修饰饰符符声声明明的的字字段段称称为为静静态态字字段,静态字段属于类,而不属于类的实例。段,静态字段属于类,而不属于类的实例。实实例例字字段段:未未用用staticstatic修修饰饰符符声声明明的的字字段段称称为为实实例例字字段段,实实例例字字段段属属于于类类的的实实例例,即即类类的的每每个个实实例例拥拥有有自己的字段。自己的字段。只只读读字字段段:用
26、用readonlyreadonly修修饰饰符符声声明明的的字字段段为为只只读读字字段段,只只读读字字段段实实质质上上是是特特殊殊的的实实例例字字段段,它它的的特特殊殊性性表表现现在在只只读读字字段段只只能能在在字字段段声声明明时时或或在在构构造造函函数数中中赋赋值。在其他地方都不能改变只读字段的值。值。在其他地方都不能改变只读字段的值。1/16/202329(2)(2)属性属性 属性用于刻画对象的特征或表示对象的状态。属属性用于刻画对象的特征或表示对象的状态。属性与字段不同,它不表示存储位置。相反,属性有访性与字段不同,它不表示存储位置。相反,属性有访问器。这些访问器指定在它们的值被读取或写入
27、时需问器。这些访问器指定在它们的值被读取或写入时需要执行的语句。因此,属性提供了一种机制,它把读要执行的语句。因此,属性提供了一种机制,它把读取和写入对象的某些特性与一些操作关联起来。给属取和写入对象的某些特性与一些操作关联起来。给属性赋值时使用性赋值时使用setset访问器,访问器,setset访问器始终使用访问器始终使用valuevalue关关键字设置属性值。获取属性值时使用键字设置属性值。获取属性值时使用getget访问器,访问器,getget访问器通过访问器通过returnreturn返回属性的值。在访问声明中,如返回属性的值。在访问声明中,如果只有果只有getget访问器,表示是只读
28、属性;如果只有访问器,表示是只读属性;如果只有setset访访问器,表示只写属性;如果既有问器,表示只写属性;如果既有getget访问器,也有访问器,也有setset访问器,表示读写属性。访问器,表示读写属性。1/16/2023307.7.类的继承、派生和多态性类的继承、派生和多态性 继承是面向对象的程序设计的一个重要特征,它允继承是面向对象的程序设计的一个重要特征,它允许在已有类的基础上创建新类,新类从已有类中继承许在已有类的基础上创建新类,新类从已有类中继承成员,而且可以重新定义或加进新成员,从而形成类成员,而且可以重新定义或加进新成员,从而形成类的层次或等级。一般称被继承的类为基类或父类
29、,而的层次或等级。一般称被继承的类为基类或父类,而称继承后产生的类为派生类或子类。称继承后产生的类为派生类或子类。1/16/202331C#C#中的继承有如下重要特性:中的继承有如下重要特性:只允许单继承,即派生类只能有一个基类。只允许单继承,即派生类只能有一个基类。继继承承是是可可以以传传递递的的,如如果果类类C C从从类类B B派派生生,而而类类B B从从类类A A派派生生,那那么么类类C C就就会会既既继继承承在在类类B B中中声声明明的的成成员员,又又继继承在类承在类A A中声明的成员。中声明的成员。派派生生类类扩扩展展它它的的直直接接基基类类,即即派派生生类类可可以以添添加加新新的的
30、成员,但不能删除从基类继承的成员。成员,但不能删除从基类继承的成员。基类的构造函数和析构函数不能被派生类继承。基类的构造函数和析构函数不能被派生类继承。派派生生类类可可以以隐隐藏藏基基类类的的成成员员,如如果果在在派派生生类类中中声声明明了了与与基基类类同同名名的的新新成成员员时时,基基类类的的该该成成员员在在派派生生类类中中就不能被访问到。就不能被访问到。1/16/202332(1)(1)派生类的声明派生类的声明类的声明格式为:类的声明格式为:属性属性 类修饰符类修饰符 class class 类名类名:基类基类 类体类体 可以看出,在派生类的声明中,通过在类名的后面可以看出,在派生类的声明
31、中,通过在类名的后面加上冒号加上冒号“:”“:”和基类的名称表示继承。派生类声明中和基类的名称表示继承。派生类声明中的其他部分与一般类的声明方法中的规定相同。的其他部分与一般类的声明方法中的规定相同。1/16/202333(2)base(2)base关键字关键字 在在有有关关继继承承和和派派生生的的程程序序设设计计中中,常常用用到到一一个个关关键键字字basebase,basebase关关键键字字用用于于从从派派生生类类中中访访问问基基类类的的成成员员,它有两种基本用法:它有两种基本用法:指指定定创创建建派派生生类类实实例例时时应应调调用用的的基基类类构构造造函函数数,用用于调用基类的构造函数
32、完成对基类成员的初始化工作。于调用基类的构造函数完成对基类成员的初始化工作。在派生类中访问基类成员。在派生类中访问基类成员。1/16/202334(3)(3)多态性多态性 多多态态性性是是指指不不同同对对象象收收到到相相同同消消息息时时,会会产产生生不不同同动动作作。从从而而实实现现“一一个个接接口口,多多种种方方法法”。C#C#支支持持两种多态性。两种多态性。第第一一种种是是编编译译时时多多态态性性,是是在在程程序序编编译译时时就就决决定定如如何何实实现现某某一一动动作作,它它通通过过方方法法重重载载和和运运算算符符重重载载实实现现。编编译译时时多多态态性性在在编编译译时时就就知知道道调调用
33、用方方法法的的全全部部信信息。息。第第二二种种是是运运行行时时多多态态性性,是是在在运运行行时时动动态态实实现现某某一动作,它通过继承和虚成员实现。一动作,它通过继承和虚成员实现。1/16/202335 对于类中的方法(函数成员),若声明时加上对于类中的方法(函数成员),若声明时加上virtualvirtual修饰符,则称该方法为虚方法,反之称为非虚修饰符,则称该方法为虚方法,反之称为非虚方法。方法。virtualvirtual修饰符不能与修饰符修饰符不能与修饰符staticstatic、abstractabstract和和overrideoverride一起使用。虚方法重载时要求方法名称、一
34、起使用。虚方法重载时要求方法名称、方法参数类型、方法参数、方法参数顺序、方法返回方法参数类型、方法参数、方法参数顺序、方法返回值类型都必须与基类中虚方法完全一样。在派生类中值类型都必须与基类中虚方法完全一样。在派生类中重载虚方法时,要加上重载虚方法时,要加上overrideoverride修饰符。修饰符。1/16/2023368.8.抽象类与密封类抽象类与密封类(1)(1)抽象类抽象类 抽抽象象类类表表示示一一种种抽抽象象的的概概念念,用用来来为为它它的的派派生生类类提提供供一一个个公公共共接接口口。在在声声明明类类时时,加加上上abstractabstract修修饰饰符符时时就就表表示示声声
35、明明该该类类为为抽抽象象类类。抽抽象象类类只只能能作作为为其其他他类的基类,不能用该类定义对象,即不能实例化。类的基类,不能用该类定义对象,即不能实例化。(2)(2)密封类密封类 在在声声明明一一个个类类时时,加加上上sealedsealed修修饰饰符符时时就就表表示示声声明明该该类类为为抽抽象象类类。抽抽象象类类与与密密封封类类是是互互斥斥的的,因因此此修修饰饰符符sealedsealed与与abstractabstract不不能能同同时时使使用用。密密封封类类是是不不能能被继承的。被继承的。1/16/2023379.object9.object类和类和stringstring类类 obje
36、ctobject类类和和stringstring类类是是在在C#C#编编程程中中经经常常用用到到的的两两个类:个类:(1 1)objectobject类类 object object类是所有其他类型的基类,在类是所有其他类型的基类,在C#C#中,所有类中,所有类型都是直接或间接地从型都是直接或间接地从objectobject类型中派生而来的。因类型中派生而来的。因此,一个此,一个objectobject类的变量可以赋予任何类型的值。类的变量可以赋予任何类型的值。(2 2)stringstring类类 string string类型专门用于对字符串的操作,它对应的系类型专门用于对字符串的操作,它
37、对应的系统类型为统类型为System.StringSystem.String。1/16/2023382.2.3接口接口接接口口是是一一组组抽抽象象的的方方法法,用用来来定定义义类类型型与与使使用用该该类类型型的的用用户户之之间间的的协协定定。一一个个接接口口可可以以从从多多个个基基接接口口继继承,而一个类或结构可以实现多个接口。承,而一个类或结构可以实现多个接口。接口和类一样,可以有方法、属性和事件等成员。接口和类一样,可以有方法、属性和事件等成员。但与类不同的是,接口仅仅提供成员的声明,并不提但与类不同的是,接口仅仅提供成员的声明,并不提供成员的实现。接口成员可以在具体的类或结构代码供成员的
38、实现。接口成员可以在具体的类或结构代码中实现。因此,一个接口定义一个协定,实现接口的中实现。因此,一个接口定义一个协定,实现接口的类或结构必须遵守其协定。类或结构必须遵守其协定。1/16/2023391.接口的定义接口的定义接口的定义格式为:接口的定义格式为:属性属性接口修饰符接口修饰符interface接口名接口名:基接口:基接口接口体接口体 其中,关键字其中,关键字interfaceinterface、接口名和接口体是必需、接口名和接口体是必需项,其他项是可选项。接口修饰符包括:项,其他项是可选项。接口修饰符包括:newnew、publicpublic、protectedprotected
39、、internalinternal、privateprivate。接口体用于定义接。接口体用于定义接口的成员。口的成员。接口支持多继承。在接口名后可以列举一个或多接口支持多继承。在接口名后可以列举一个或多个继承接口,相互之间以逗号分隔。个继承接口,相互之间以逗号分隔。1/16/2023402.2.接口的实现接口的实现 当希望类成员展示某些特性时,可以将这些成员当希望类成员展示某些特性时,可以将这些成员分组在接口中,然后在类或结构中实现。分组在接口中,然后在类或结构中实现。1/16/202341interface Secret /interface Secret /定义接口类型定义接口类型Sec
40、retSecret void Encrypt();void Encrypt();void Unencrypt();void Unencrypt();class Message:Secret /class Message:Secret /在类在类MessageMessage中实现了接口中实现了接口SecretSecret public void Encrypt()public void Encrypt()public void Unencrypt()public void Unencrypt()本例中,类本例中,类MessageMessage实现了接口实现了接口SecretSecret中声明的所
41、有方法。中声明的所有方法。1/16/202342一个接口声明一个只有抽象成员的引用类型。这就暗示一个接口声明一个只有抽象成员的引用类型。这就暗示了不能实例化一个接口,只能实例化一个派生自该接了不能实例化一个接口,只能实例化一个派生自该接口的对象。口的对象。interfaceIFacevoidShowMyFace();不能从这个定义实例化不能从这个定义实例化一个对象,但可以从它一个对象,但可以从它派生一个类。派生一个类。class CFace:IFacepublic void ShowMyFace()Console.WriteLine(implementation);1/16/2023432.2
42、.4 2.2.4 委托委托 委托(委托(delegatedelegate)用来封装带有特定签名和返回类型的方法,)用来封装带有特定签名和返回类型的方法,可以在委托中封装任何匹配的方法(在可以在委托中封装任何匹配的方法(在C+C+或者其他语言中,实现或者其他语言中,实现这一点需要使用函数指针或成员函数指针。与函数指针不同,委这一点需要使用函数指针或成员函数指针。与函数指针不同,委托是面向对象的,而且是类型安全和可靠的)。托是面向对象的,而且是类型安全和可靠的)。实际上,实际上,C#中的中的委托委托和和C/C+中的函数指针非常相似,使用中的函数指针非常相似,使用委委托托可以把可以把委托委托内部方法
43、的引用封装起来,然后通过它使用内部方法的引用封装起来,然后通过它使用委托委托引引用的方法。用的方法。特性:特性:(1)就是不需要知道被引用的方法属于那一个类对象,只要函数的参就是不需要知道被引用的方法属于那一个类对象,只要函数的参数个数与返回类型与数个数与返回类型与委托委托对象一致。对象一致。(2)定义复合定义复合委托委托对象。只有同样类型的对象。只有同样类型的委托委托才能够复合起来。才能够复合起来。+定义复合定义复合委托委托对象对象-从一个复合从一个复合委托委托中去掉一个中去掉一个委托委托对象对象。1/16/2023441.1.委托的定义委托的定义委托的定义格式为:委托的定义格式为:属属性性
44、 委委托托修修饰饰符符 delegate delegate 返返回回值值类类型型 标标识识符符(参参数数列列表表)其中,委托修饰符包括:其中,委托修饰符包括:newnew、publicpublic、protectedprotected、internalinternal、privateprivate;标识符为新声明的委托类型;返;标识符为新声明的委托类型;返回值类型和参数列表为所封装的方法的返回值类型和回值类型和参数列表为所封装的方法的返回值类型和参数列表,而且参数列表的类型和顺序都要与所封装参数列表,而且参数列表的类型和顺序都要与所封装方法的参数相同。方法的参数相同。1/16/2023452.
45、2.创建委托的实例创建委托的实例 在在定定义义了了委委托托之之后后,就就可可以以和和类类的的实实例例化化一一样样,通通过过newnew运运算算符符来来创创建建委委托托的的实实例例(即即对对象象),传传入入与与返返回类型和签名都匹配的方法。格式如下:回类型和签名都匹配的方法。格式如下:委托名委托名 实例名实例名=new =new 委托名委托名(参数参数););其中,参数有三种情况:其中,参数有三种情况:(1 1)类的静态方法名)类的静态方法名(2 2)类实例(即对象)的实例方法名)类实例(即对象)的实例方法名(3 3)另一个委托)另一个委托1/16/202346delegatestringMyD
46、elegate();publicclassMyClasspublicstringSayHello()return“Hellotheworld!”;publicclassTestMyClasspublicstaticvoidMain(stringargs)MyClassmyClass1=newMyClass();MyDelegatemyDelegate1=newMyDelegate(myClass1.SayHello);/下面就使用下面就使用myDelegate1代替对象代替对象myClass1的的SayHello方法方法 Console.WriteLine(myDelegate1();/输出结
47、果为输出结果为hellotheworld!/调用调用myClass1.SayHello();效果相同效果相同1/16/202347usingSystem;delegatevoidMyDelegate(strings);publicclassMyClasspublicvoidSayHello(stringwho)System.Console.WriteLine(who+hello!);publicvoidSayGoodBye(stringwho)System.Console.WriteLine(who+goodbye!);publicclassTestMyClasspublicstaticvoi
48、dMain(stringargs)MyClassmyClass1=newMyClass();MyDelegatemyDelegate,myDelegate1;myDelegate=newMyDelegate(myClass1.SayHello);myDelegate1=newMyDelegate(myClass1.SayGoodBye);myDelegate+=myDelegate1;/这样调用这样调用myDeletage就相当于同时调用了就相当于同时调用了myClass1.SayHello和和myClass1.SayGoodByemyDelegate();/执行结果输出执行结果输出hello
49、!goodbye!1/16/2023482.2.5 2.2.5 事件事件 事事件件就就是是当当对对象象上上发发生生某某种种事事情情时时,对对象象向向其其客客户户端端通通知知操操作作发发生生的的方方法法。触触发发事事件件的的对对象象叫叫事事件件发发送送方,捕获事件并对其作出响应的对象叫做事件接收方。方,捕获事件并对其作出响应的对象叫做事件接收方。由于事件发送方事先不知道哪些对象或方法将处理由于事件发送方事先不知道哪些对象或方法将处理它引发的事件,所以,需要在发送方和处理方之间使它引发的事件,所以,需要在发送方和处理方之间使用一个媒介来联系。在用一个媒介来联系。在C#C#中,使用委托作为这个纽带。
50、中,使用委托作为这个纽带。在发布事件的类中定义用委托声明的事件,在事件接在发布事件的类中定义用委托声明的事件,在事件接收方定义响应事件的事件处理方法,事件和方法通过收方定义响应事件的事件处理方法,事件和方法通过委托进行关联。委托进行关联。1/16/202349 事事件件本本质质上上是是类类中中的的一一个个委委托托类类型型数数据据成成员员,在在类类中声明事件有两步。中声明事件有两步。(1 1)必须声明该事件的委托类型。如:)必须声明该事件的委托类型。如:public public delegate delegate void void EventHandler(object EventHandl