




已阅读5页,还剩77页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
教师:金海溶办公室:QL329,第三章C#面向对象程序设计,VisualC#.NET程序设计基础教程第3章,类,面向对象程序设计:从客观世界的对象的属性、状态和行为出发,进行复杂事物管理与问题求解。类:是面向对象程序设计的基本构成模块类的定义:类是具有相同或相似属性和行为的对象的集合,它也是一种数据结构,包含数据成员和函数成员。数据成员类型:常量,字段,事件函数成员类型:方法、属性、索引器、操作符、构造函数和析构函数静态成员:可以在类的实例之间共享,可以看作是类的全局对象,不需要实例化类即可访问(如int.Parse()p51-54,自学相关理论知识,VisualC#.NET程序设计基础教程第3章,定义类,C#使用class关键字来定义类。其基本结构如下:ClassMyClass/classmembers还可以在类定义中指定继承。C#支持类的单一继承,即只能有一个基类,且位于继承列的首项,语法如下:classMyClass:MyBaseClass/classmembers定义抽象类(不能实例化的类):publicabstractclassMyClass定义不能被继承的类:publicsealedclassMyClass,VisualC#.NET程序设计基础教程第3章,4,类限制修饰符:public:可以被任意访问;protected:只可以被本类和其派生类(子类)访问;private:只可以被本类所访问。internal:只能在当前程序中被访问,即编译后扩展名为.DLL或.EXE文件中的代码访问。protectedinternal:唯一的一种组合限制修饰符,它只可以被当前程序内所有的类和这些类的派生类所访问。,定义类,构造函数p57,构造函数的函数名必须与类的名字相同,而且是没有任何返回值,用来实例化类的对象classMyClasspublicMyClass()/构造函数代码/类的其他成员定义,VisualC#.NET程序设计基础教程第3章,析构函数p58,类的析构函数是用类名和前缀来声明的。当释放对象时,就执行析构函数中的代码,释放资源。在调用这个析构函数后,还将隐式地调用基类的析构函数,包括System.Object根类中的Finalize()调用。classMyClassMyClass()/析构函数代码,VisualC#.NET程序设计基础教程第3章,This的引用,在方法中,可以使用一个关键词this,来表示这个对象本身。在普通方法中,this表示调用这个方法的对象;在构造方法中,this表示所新创建的对象。,VisualC#.NET程序设计基础教程第3章,定义类成员,成员定义所有成员都有自己的访问级别,用下面的关键字之来定义:public成员可以由任何代码访问。private成员只能由类中的代码访问internal成员只能由定义它的工程内部的代码访问。proteded成员只能由类或派生类中的代码访问。,VisualC#.NET程序设计基础教程第3章,对于class如果没有加修饰符,那么修饰符为internal对于类中的成员如果没有加修饰符,那么修饰符为private对于接口的成员如果没有加修饰符,那么修饰符为public,9,访问修饰符,Teacher类,private成员,protected成员,public成员,internal成员,Student类,只有Student类在Teacher类都在同一程序集中,才可访问internal成员,不可访问,不可访问,可以访问,字段和属性p66,通过属性和字段可以访问类中的数据,但属性和字段是不同的字段理解为类级别的变量、常量,用于存储该类的实例的相关数据,在定义类时应该设置为私有属性将类中的数据暴露于类外,属性=字段(私有)+1到2个方法(取值方法get和赋值方法set),VisualC#.NET程序设计基础教程第3章,属性的定义,Public字段类型属性名getreturn字段;/读取字段set字段=value;/设置字段,VisualC#.NET程序设计基础教程第3章,字段和属性例子,classpersonprivatestringname;/定义姓名字段nameprivatestringsex;/定义性别字段sexpublicstringName/定义姓名属性Namegetreturnname;setname=value;publicstringSex/定义性别属性Sexgetreturnsex;setif(value.Equals(男)|value.Equals(女)|value.Equals(male)|value.Equals(female)sex=value;elsesex=“未进行正确赋值”;,VisualC#.NET程序设计基础教程第3章,方法和事件,“方法”是包含一系列语句的代码块,它代表类的对象的行为,完成某些处理功能事件可以理解为是类或对象告诉我们发生某种状况的一种方式。发送(或引发)事件的类称为“发行者”,接收(或处理)事件的类称为“订户”。例:按钮button1,则button1.text是属性;button1.onClick是事件;button1.doClick()是方法,VisualC#.NET程序设计基础教程第3章,方法,方法使用标准函数格式,以及可访问性和可选的static修饰符来声明用static修饰的方法只能通过类访问,不能通过类的对象访问,如int.Parse()可以在方法定义中使用下述关键字:extern方法定义放在其他地方。abstract方法必须重写(只用于抽象类中)。virtual方法可以重写。override方法重写了一个基类方法(如果方法被重写,就必须使用该关键字)。,VisualC#.NET程序设计基础教程第3章,virtual和override,virtual用在基类中,指定一个虚方法(属性),表示这个方法(属性)可以重写override用在派生类中,表示对基类虚方法(属性)的重写不能重写非虚方法或静态方法。重写的基方法必须是virtual、abstract或override修饰的例子,VisualC#.NET程序设计基础教程第3章,virtual和override例子,基类publicclassBaseClasspublicvirtualstringGetString()return这是一个虚方法。;派生类publicclassSonClass:BaseClasspublicoverridestringGetString()return这是重写了的方法。;,VisualC#.NET程序设计基础教程第3章,类成员的其他议题,隐藏基类方法当在派生类中定义了一个和基类同名的方法,格式如下:newpublicvoidfunction()则基类中的该方法在派生类中被隐藏了,VisualC#.NET程序设计基础教程第3章,classmybasepublicvoiddosomething()Console.WriteLine(base);,classmyderive:mybasenewpublicvoiddosomething()Console.WriteLine(derive);,类成员的其他议题,隐藏和重写的区别,VisualC#.NET程序设计基础教程第3章,3.3.2类成员的其他议题,结论:重写:当派生类转换为基类时,重写的方法依然可以调用隐藏:当派生类转换为基类时,派生类的方法被基类的被隐藏方法代替调用重写或隐藏的基类方法base.functionname();例子,VisualC#.NET程序设计基础教程第3章,调用重写或隐藏的基类方法例子,classAprivateinta=2;privateintb=2;publicvirtualintcalculate()returna+b;,VisualC#.NET程序设计基础教程第3章,classB:Apublicoverrideintcalculate()returnbase.calculate()/2;,类定义任务,编写一个矩形类,私有数据成员为矩形的长(len)和宽(wid),无参构造函数将len和wid设置为0,有参构造函数设置相应的len和wid,类包括属性:LEN和WID,分别为矩形的长和宽;类的公有方法有:求周长、求面积。在主函数中创建2个矩形实例,一个使用构造函数设置长为5,宽为4,另一个创建时不提供长和宽的值,创建后通过属性设置长和宽,最后请输出两个矩形的长,宽,周长和面积。,VisualC#.NET程序设计基础教程第3章,类的使用一,使用Array类中的reverse方法实现字符串逆序,VisualC#.NET程序设计基础教程第3章,类的使用二,使用ArrayList类中的reverse方法实现句子中单词位置的逆序happybirthdaytoyouyoutobirthdayhappystrings=Console.ReadLine();ArrayListarr=newArrayList(s.Split();arr.Reverse();stringstr=string.Join(,(string)arr.ToArray(typeof(string);Console.WriteLine(str);,VisualC#.NET程序设计基础教程第3章,VisualC#.NET程序设计基础教程第3章,任务,VisualC#.NET程序设计基础教程第3章,类的使用三,编写一个类MyRead,程序集为MyRead.dll;命名空间MyDll,分别提供整数和浮点数的输入方法MyRead.ReadInt():实现整数的输入,用逗号或空格隔开MyRead.ReadDouble():实现浮点数输入,并用逗号或空格隔开实现方法:,VisualC#.NET程序设计基础教程第3章,类的使用三,VisualC#.NET程序设计基础教程第3章,类的使用三,VisualC#.NET程序设计基础教程第3章,类的使用四,VisualC#.NET程序设计基础教程第3章,从键盘输入一组整数,并按降序进行排序存放,并将排序后的整数输出在此例中,我们使用自定义命名空间MyDll中的MyRead类协助数据的读取实现步骤如下新建项目intsort引用MyRead命名空间所在的程序集MyRead.dll到项目中在项目文件中使用using导入命名空间MyDll使用MyRead类中的静态方法MyRead.ReadInt()读入数据实现排序与输出,类的使用四,VisualC#.NET程序设计基础教程第3章,将程序集复制到项目的某文件夹,添加引用,usingSystem;usingSystem.Collections.Generic;usingSystem.Text;usingMyDll;namespaceintsortclassProgramstaticvoidMain(stringargs)inta;Console.WriteLine(“请输入一组整数);a=MyRead.ReadInt();Array.Sort(a);Array.Reverse(a);foreach(intaaina)Console.Write(00,aa);,VisualC#.NET程序设计基础教程第3章,类的静态方法由类直接调用,不需要通过实例,接口p76-80,接口是在功能的使用者和提供者之间建立的规范,它定义了功能数量,函数名称,参数,参数顺序。接口不能实例化,接口的成员都是公有的接口声明的方式与声明类的方式相似:interfaceImyInterface/interfacemembers接口可以继承:publicinterfaceIMyInterface:IMyBaseInterface,ImyBaseInterface2/interfacemembers,VisualC#.NET程序设计基础教程第3章,接口,接口成员的定义与类成员的定义也相似,但有几个重要的区别:不允许使用访问修饰符,所有的接口成员都是公共的接口成员不能包含代码体。接口不能定义字段成员。接口成员不能用关键字static,virtual,abstract或sealed来定义。,VisualC#.NET程序设计基础教程第3章,在类中实现接口,执行接口的类必须包含该接口所有成员的执行代码,且必须匹配指定的签名,并且必须是公共的。继承一个实现给定接口的基类,就意味着派生类隐式地支持这个接口,VisualC#.NET程序设计基础教程第3章,在类中实现接口例子,/定义接口interfaceIpointvoidDisplayValue();voidDisplayValue2();/在testclass1中实现接口publicclassTestClass1:IpointpublicvoidDisplayValue()Console.WriteLine(“A);publicvoidDisplayValue2()Console.WriteLine(“B”);,VisualC#.NET程序设计基础教程第3章,/在testclass2中实现接口publicclassTestClass2:IpointpublicvoidDisplayValue()Console.WriteLine(“1);publicvoidDisplayValue2()Console.WriteLine(“2”);/testclass2结束,在类中实现接口例子续,usingSystem;usingSystem.Collections.Generic;usingSystem.Text;namespaceinterface_empclasstestMainSTAThreadstaticvoidMain(),VisualC#.NET程序设计基础教程第3章,/测试接口TestClass1t1=newTestClass1();t1.DisplayValue();t1.DisplayValue2();TestClass2t2=newTestClass2();t2.DisplayValue();t2.DisplayValue2();Console.ReadKey(true);,System.Collections.Icomparer接口的实现与应用1,实现对结构体student的排序structstudentpublicstringsname;publicintage;publicintscore;要求:实现对学生年龄进行升序排序后输出记录实现对学生成绩降序排序后输出记录,VisualC#.NET程序设计基础教程第3章,System.Collections.Icomparer接口的实现与应用2,VisualC#.NET程序设计基础教程第3章,System.Collections.Icomparer接口的实现与应用3,VisualC#.NET程序设计基础教程第3章,sortstudent_ageagesort=newsortstudent_age();sortstudent_scorescoresort=newsortstudent_score();Console.WriteLine(按年龄从小到大排序);arr.Sort(agesort);foreach(studentsinarr)Console.WriteLine(“name:”+s.sname+“age:”+s.age+“score:”+s.score);Console.WriteLine(nn按成绩从高到低排序);arr.Sort(scoresort);arr.Reverse();foreach(studentsinarr)Console.WriteLine(name:+s.sname+age:+s.age+score:+s.score);/main函数结束/programclass结束,System.Collections.Icomparer接口的实现与应用4,VisualC#.NET程序设计基础教程第3章,classsortstudent_age:IComparerpublicintCompare(objecta,objectb)return(student)a).age-(student)b).age;classsortstudent_score:IComparerpublicintCompare(objecta,objectb)return(student)a).score-(student)b).score;/namespace结束,复制,System.Object.MemberwiseClone():创建一个新对象,然后将当前对象的非静态字段复制到该新对象。如果字段是值类型的,则对该字段执行逐位复制。如果字段是引用类型,则复制引用但不复制引用的对象;因此,原始对象及其复本引用同一对象进行引用复制。,VisualC#.NET程序设计基础教程第3章,复制,publicclassIdInfopublicintIdNumber;publicIdInfo(intIdNumber)this.IdNumber=IdNumber;publicclassPersonpublicintAge;publicstringName;publicIdInfoIdInfo;publicPersonGetCopy()return(Person)this.MemberwiseClone();,VisualC#.NET程序设计基础教程第3章,publicstaticvoidMain()Personp1=newPerson();p1.Age=42;p1.Name=Sam;p1.IdInfo=newIdInfo(6565);Personp2=(Person)p1.GetCopy();p1.Name=Frank;p1.IdInfo.IdNumber=7878;Console.WriteLine(p1.Name+p1.IdInfo.IdNumber);Console.WriteLine(p2.Name+p2.IdInfo.IdNumber);,深度复制,修改GetCopy()方法就可以进行深度复制.NETFramewok提供了ICloneable接口来实现深度复制该接口有一个方法Clone(),这个方法不带参数,返回一个对象类型。但必须通过实现ICloneable接口的Clone()方法才能实现真正的深度复制,VisualC#.NET程序设计基础教程第3章,深度复制,publicclassIdInfo:ICloneablepublicintIdNumber;publicIdInfo(intIdNumber)this.IdNumber=IdNumber;publicobjectClone()returnMemberwiseClone();,VisualC#.NET程序设计基础教程第3章,publicclassPerson:ICloneablepublicintAge;publicstringName;publicIdInfoIdInfo;publicobjectClone()Personother=(Person)this.MemberwiseClone();other.IdInfo=(IdInfo)other.IdInfo.Clone();returnother;,索引器,索引器:使得对象可以像数组那样被方便,直观的引用,它为我们提供了通过索引方式方便地访问类的数据信息的方法,VisualC#.NET程序设计基础教程第3章,索引符(器),索引器语法:访问修饰符返回类型this参数列表getreturn类中的集合或数组参数列表;set类中的集合或数组参数列表=value;,VisualC#.NET程序设计基础教程第3章,索引符(器),索引器:使得可以像数组那样对对象使用下标,它为我们提供了通过索引方式方便地访问类的数据信息的方法索引器的名称只能是this,必须至少有一个参数可以重载,因为索引器有参数可以通过索引器方便的访问类中的数组或者集合,VisualC#.NET程序设计基础教程第3章,索引符(器)例子,VisualC#.NET程序设计基础教程第3章,编写一个类,包含一个100元素的整型数组,要求给类设计一个索引器,实现通过类名索引值的方式直接访问类中数组的元素classtestprivateinta=newint100;publicintthisintindexgetreturnaindex;setaindex=value;,staticvoidMain(stringargs)testt=newtest();for(inti=0;i100;i+)ti=i;Console.WriteLine(t.a50=+t50);Console.Read();P82页程序阅读与测试,VisualC#.NET程序设计基础教程第3章,一个字符串作为键值的索引器例子,VisualC#.NET程序设计基础教程第3章,一个字符串作为键值的索引器例子2,VisualC#.NET程序设计基础教程第3章,一个字符串作为键值的索引器例子3,VisualC#.NET程序设计基础教程第3章,定制异常,.NET框架提供了一种用于报告错误的标准机制,称之为结构化异常处理(SEH,StructuredExceptionHandling)。异常是描述错误的类。.NET架使用异常来报告错误,并且在代码中也可以使用异常。编写代码来监视任何代码段生成的异常。在处理异常时要标识三个代码块:,VisualC#.NET程序设计基础教程第3章,定制异常,在C#中,异常的生成称之为抛出(throwing)异常。被通知抛出了一个异常则称之为捕获(catching)异常处理完异常之后执行的代码块是终结(finally)代码块,VisualC#.NET程序设计基础教程第3章,指定异常处理,C#的关键字try指定让某个代码块监视代码执行时抛出的任何异常。使用try关键字很简单。使用时,try关键字后面跟一对花括号,花括号中的语句用来监视代码执行时抛出的异常。try/placesatementshere在执行try代码块中的任何语句时,如果有异常抛出,就可以在代码中捕获该异常并相应进行处理。,VisualC#.NET程序设计基础教程第3章,捕获异常,最简单形式的catch代码块捕获前面try代码块中代码抛出的任何异常。catch代码块的结构类似try代码块:try/placestatementsherecatch/placestatementshere,VisualC#.NET程序设计基础教程第3章,捕获特定类的异常,try/placestatementsherecatch(ExceptionthrownException)/palcestatementshere,VisualC#.NET程序设计基础教程第3章,出现异常之后进行消除,trycatch/catchexceptionsfinally/closefilesorclosedatabaseconnection,VisualC#.NET程序设计基础教程第3章,finally块:在处理完异常或者异常没有发生时都将执行这块代码。因此应该将有无异常情况下都必须执行的代码放在此处,由.NET框架定义的异常,OutOfMemoryException异常StackOverflowException异常NullReferenceException异常TypeInitializationException异常InvalidCastException异常ArrayTypeMismatchException异常IndexOutOfRangeException异常DivideByZeroException异常0verflowException异常,VisualC#.NET程序设计基础教程第3章,异常的几个只读属性,System.Exception类包含四个只读属性Message:属性包含对异常原因的描述。InnerException:获取导致当前异常的Exception实例StackTrace:获取当前异常发生时调用堆栈上的帧的字符串表示形式。TargetSite:获取引发当前异常的方法这些属性可以在catch块中根据需要使用,VisualC#.NET程序设计基础教程第3章,自定义的异常,ApplicationException类:由用户程序引发,而不是由公共语言运行库引发的异常自定义异常需要从ApplicationException类派生此外自定义异常需要在构造函数中设置message属性的值可以用C#的throw关键字抛出自定义的异常。例子:,VisualC#.NET程序设计基础教程第3章,自定义的异常,classMyException:ApplicationExceptionpublicMyException():base(Thisismyexceptionmessage.)classProgramstaticvoidMain(stringargs)trythrownewMyException();catch(MyExceptionex)Console.WriteLine(ex.Message);Console.WriteLine(ex.TargetSite)finallyConsole.ReadLine();,VisualC#.NET程序设计基础教程第3章,事件和委托,事件是对象执行一些任务时发生的一些事情,并能将其通知调用程序,启动某个或某些动作来处理这个事情。委托是c#中类用户接受和处理事件的方法,它是一个“函数模板”,定义了事件处理程序的返回类型和调用参数表,使事件引发者和事件处理者都必须遵循这个模板进行事件的引发和处理工作。选择性自学p87-91,VisualC#.NET程序设计基础教程第3章,事件和委托,激发和处理事件的步骤:定义委托publicdelegate返回类型委托表示符(参数表)publicdelegatevoidEvenHandler(objecta)定义事件event事件委托类型事件标识符事件委托标识符匹配publiceventEvenHandlermyevent安装事件事件实例+=new事件委托(事件处理方法)myevent+=newEvenHandler(do_myevent)激发事件事件实例(与事件委托相匹配的参数表)myevent(a);,VisualC#.NET程序设计基础教程第3章,标准化事件设计-例,例子:每5秒钟输出一次时间,精确到秒:采用自定义事件实现/定义委托publicdelegatevoidEvenTimeHandler(objectsender,onEventimeArgsEvenTimeArgs);/定义委托/定义派生于EventArgs类的派生类,事件参数onEventimeArgs类publicclassonEventimeArgs:EventArgsprivateDateTimenewtime;publiconEventimeArgs(DateTimetemp)/构造函数this.newtime=temp;publicDateTimenewdt/定义属性getreturnnewtime;,VisualC#.NET程序设计基础教程第3章,标准化事件设计-例续2,/定义事件的处理类,这里仅显示时间classEvenTimeHandlerClasspublicvoidshowtime(objectsender,onEventimeArgsEvenTimeArgs)Console.WriteLine(EvenTimeArgs.newdt);,VisualC#.NET程序设计基础教程第3章,classTimelist/定义了一个公共事件,其委托类型为EvenTimeHandlerpubliceventEvenTimeHandleronEventime;publicTimelist()onEventime=null;publicvoidtestevent()DateTimedt=newDateTime();dt=DateTime.Now;Console.WriteLine(0,dt);DateTimenextdt;while(true)nextdt=DateTime.Now;if(dt.AddSeconds(5)比较运算符:=,!=,=例子,VisualC#.NET程序设计基础教程第3章,例子,publicenumMFNone,H2,O2,H2O;/枚举publicclassChemicalprivateMF_element;publicMFElement/定义属性getreturn_element;set_element=value;publicChemical(MFelement)/构造函数Element=element;,VisualC#.NET程序设计基础教程第3章,完整程序见备注,例子续,/重载+运算符publicstaticChemicaloperator+(Chemicalc1,Chemicalc2)if(c1.Element=MF.H2,VisualC#.NET程序设计基础教程第3章,上机作业,定义类student私有字段:name,score属性:NAME,SCORE(0100分)构造函数2个:无参数和带参数(姓名,成绩)方法:GiveScore(inta):成绩加a分TakeOffScore(inta):成绩减a分创建2位学生对象,张飞和刘备,成绩分别为87和93制作下一页的界面,并实现正确赋值和按钮功能,VisualC#.NET程序设计基础教程第3章,设计界面要求,VisualC#.NET程序设计基础教程第4章,Label,ComboBox(编辑项),TextBox,Button,部分提示1,按要求定义student类制作界面,特别提示:ComBoBox控件是下拉列,添加下拉列表项的方法:选择控件,单击右上角的三角,然后单击编辑项,在弹出的编辑框中输入数据,注意一个姓名一行,完成后单击确定即可为classform1添加两个数据成员,VisualC#.NET程序设计基础教程第3章,部分提示2,添加form1的load事件的处理函数,使程序运行一开始,在界面上显示张飞和刘备的初始成绩,并使ComBoBox控件选中第一项,步骤如下:选中form控件,双击form控件的空白处,添加load事件处理方法编写处理函数1创建张飞和刘备两个学生对象,并初始化数据成员2将两个学生的成绩在界面的正确位置显示3ComBoBox默认选中第一项,VisualC#.NET程序设计基础教程第3章,部分提示3,编写加分按钮处理代码编写减分按钮处理代码
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 人教版五年级数学下册期末解答考试题(附答案)
- 人教pep版小学五年级下册期末英语模拟提高试题测试题(及答案)
- (完整版)数学北师大六年级下册期末测试模拟试题经典答案
- 2025-2026学年福建省龙岩市连城县一中高一上学期入学考化学试题及答案
- 2024年消防设施操作员考试题库及答案
- 2025年监理工程师考试建筑工程目标控制考试题库及答案
- 2025年标准通信工程安全员考试题及答案
- 铆工与钣金工考工试题库(含答案)
- 2024知识考核科技咨询师三级真题及答案完整版
- 2025年时政热点考试试题目答案
- 2025年未来就业报告
- 邮储银行存款课件
- 2024国家公务员考试地市级申论第2题(带标准答案)
- 药品追溯管理培训试题(附答案)
- 2025年校招:财务岗试题及答案
- 羽毛球讲解课件
- 质量意识题目及答案
- 工程建设施工项目管理人员职业标准
- GA 1808-2022军工单位反恐怖防范要求
- 工程建设项目绿色建造施工水平评价申请表
- 液压基础知识培训课件
评论
0/150
提交评论