




已阅读5页,还剩48页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
C#网络编程技术教程,第三章C#面向对象编程,学习目标,理解面向对象的基本概念。了解基本的面向对象分析、设计方法,主要是UML中的类图和序列图。掌握C#中类的定义和实例化方法。掌握C#中继承、多态、接口的实现方法。,本章内容,3.1面向对象的基本概念3.2类和对象3.3字段3.4方法3.5属性与索引3.6委托与事件3.7继承与多态3.8基于UML的系统分析与设计方法,3.1面向对象的基本概念,客观世界是由各种各样的对象组成的,如汽车、飞机、火车、人等。每种对象都有各自的内部状态和运动规律,不同对象之间的相互作用和联系就构成了各种不同的系统。将客观世界中的对象模型化,形成一种计算机化的表示,并以此为基础来分析和解决问题便形成了面向对象技术。PeterCoad和EdwardYourdon提出了下列等式来说明面向对象技术。面向对象=对象+分类+继承+消息通信可以说,采用对象、类、继承、消息这4个概念开发的软件系统是面向对象的。,3.1面向对象的基本概念,1对象在面向对象技术中,任何客观事物都是对象,对象是对客观事物的抽象。任何复杂的事物都可以通过对象的某种组合结构构成。复杂对象可由相对比较简单的对象以某种方式组成。对象由属性和方法组成。属性反映了对象的信息特征,而方法则定义改变属性状态的各种操作。因此,对象是属性和方法的一个封装体。通过封装可以更好地隐蔽对象的内部细节,只保留有限的对外接口实现对外联系。每个对象都有自身唯一的标识,通过这种标识,可找到相应的对象。在对象的整个生命期中,它的标识都不改变,不同的对象不能有相同的标识。2类具有相同属性和方法的对象可归纳成类,对象是类的一个实例,而对象的抽象是类。类具有属性,它是对象的状态的抽象,用数据结构来描述类的属性;类具有操作,它是对象的行为的抽象,用操作名和实现该操作的方法来描述。,3.1面向对象的基本概念,3继承类有一定的结构,可以派生出子类,子类除了继承父类的属性和方法外还可以有自己的属性和方法。对象和类之间的层次结构靠继承关系维系。继承是子类自动共享父类数据结构和方法的机制,也是面向对象程序设计语言不同于其他语言的最重要的特点。在类层次中,将子类只继承一个父类的数据结构和方法的方式称为单重继承;将子类继承多个父类的数据结构和方法的方式称为多重继承。在软件开发中,类的继承使所建立的软件具有开放性、可扩充性,这是信息组织与分类的行之有效的方法,它简化了对象、类的创建工作量,增加了代码的重用性。同时,通过类的继承关系,使公共的特性能够共享,提高了软件的重用性。4消息对象之间的联系主要是通过传递消息来实现,消息传递是对象间通信的手段,一个对象通过向另一个对象发送消息来请求其服务。一个消息通常包含接收对象的标识、发送给接收对象的消息名(方法名)和适当的参数。消息只告诉接收对象需要完成什么操作,但并不指示接收者如何完成操作。消息完全由接收者解释,并由其独立决定采用什么方法完成所需的操作。,3.1面向对象的基本概念,5多态性多态性是指相同的操作或方法可作用于多种类型的对象上并获得不同的结果。即将不同的对象收到同一消息时产生不同的结果的现象称为多态性。多态性允许每个对象以适合自身的方式去响应共同的消息,增强了软件的灵活性和重用性。面向对象技术正是利用对现实世界中对象的抽象和对象之间的相互关联和相互作用的描述来模拟现实世界,并且使其映射到目标系统中。,3.2类和对象,类是对象的抽象描述,类似于模板。从定义上来说,类是一种复杂的数据结构,其中包含数据成员和功能成员。在C#中,类必须先定义后使用。1类的定义类是C#中最基础的类型。类是一个数据结构,将数据成员(状态)和功能成员(行为)组合在一个单元中,进而体现了面向对象技术的封装性。类的定义格式如下:Attribute类修饰符class类名:基类和实现的接口列表类成员定义其中,类的修饰符如下表所示。,3.2类和对象,下面是一个名为Point的简单类的声明。publicclassPointprivateintx,y;/数据成员publicPoint(intx,inty)/功能成员this.x=x;this.y=y;,3.2类和对象,2类的成员类的成员分为数据成员和功能成员,其中数据成员包括:成员常量,代表与类相关的常数数据;字段,类的变量。功能成员包括:方法,即类中的成员函数;属性,定义了命名的属性以及读写属性的相关的行为;索引,允许类的实例通过与数组相同的方法来索引;操作符,定义了可以用于类的实例上的表达式操作;事件,定义了由类产生的事件公告;构造函数,对类的实例进行初始化的操作;析构函数,在类的实例销毁前执行与资源释放相关的操作。3类成员的可访问性类的每个成员都有关联的可访问性,它控制能够访问该成员的程序区域。在C#中,有5种可能的可访问性,如下表所示。,3.2类和对象,4静态成员和非静态成员类的成员可以是静态成员,也可以是非静态成员。在C#中,用关键字static修饰的类成员(包括字段、方法、属性、事件、操作符或构造函数)称为静态成员,它们属于类。而没有用关键字static修饰的类成员称为非静态成员,它们属于对象。静态成员具有如下特征。一个静态字段对应一个存储位置,不管其包含类创建了多少个实例,总是只有一个静态字段的备份。静态成员(包括方法、属性、事件、操作符或构造函数)不会对非静态成员进行操作,也不能使用this。静态成员属于类,因此可以在包含类的实例之间共享它们。静态成员一般通过类来访问,例如Console.ReadLine(),其中ReadLine()就是类Console中的静态方法。对于非静态字段,在包含类的每个实例中都包括一个它的独立备份,同时在非静态成员中可以使用this,也可以对非静态成员进行操作。非静态成员通过包含类的实例来访问。,3.2类和对象,5对象对象是类的实例。与C+不同,在C#中,类是一种引用类型,因此在C#中不能直接用类来定义对象,它定义的只是一个对象引用变量。一般可以使用new运算符动态创建一个对象,再将其赋值给一个对象引用变量。例如:Pointp1=newPoint(0,0);/指向一个动态创建的Point对象Pointp2=p1;/p1和p2指向同一个Point对象Pointp3;/不指向任何对象当不再使用对象时,该对象所占的内存将被自动回收。在C#中,没有必要也不可能显式地释放对象。而是通过系统中的垃圾回收器来实现对无用对象的回收操作。6构造函数与析构函数C#既支持实例构造函数,也支持静态构造函数。实例构造函数用来初始化类实例中的数据成员。静态构造函数用来在类首次加载时初始化类本身的数据成员,即静态字段。构造函数的名称与类名相同,没有返回类型。若构造函数的声明中包含static修饰符,则它声明了一个静态构造函数,否则声明的是实例构造函数。静态构造函数不需要访问修饰符,同时也不带任何参数;实例构造函数可以带参数表,可以加访问修饰符进行修饰,不能被继承。如果一个类没有声明任何实例构造函数,则会自动为它提供一个默认的空的实例构造函数,一般其参数列表为空,函数体也为空。,3.2类和对象,由于实例构造函数可以带参数,因此实例构造函数可以重载,并且可以通过参数列表(参数的个数、类型和顺序)来区分不同的实例构造函数。析构函数是用于实现析构类实例所需操作的成员。析构函数不能带参数,不能具有可访问性修饰符,也不能被显式地调用。当没有任何代码要使用一个实例时,系统中的垃圾回收器会自动调用该实例的析构函数对其进行析构,如代码实例所示。,usingSystem;namespaceex_3_1classProgramprivateintdata;/非静态数据成员(字段)staticprivateintstaticdata;/静态数据成员publicProgram()/无参数实例构造函数Console.WriteLine(无参数构造函数);data=0;publicProgram(intvalue)/带参数实例构造函数Console.WriteLine(带参数构造函数);data=value;staticProgram()/静态构造函数Console.WriteLine(静态构造函数);staticdata=100;,Program()/析构函数Console.WriteLine(析构函数);publicvoidPrint()/打印方法Console.WriteLine(Staticdatais0,Datais1,staticdata,data);staticvoidMain(stringargs)Programp1;/没有创建对象Programp2=newProgram();/创建一个对象Programp3=newProgram(50);/创建一个对象p1=p3;p1.Print();p2.Print();p3.Print();,3.3字段,字段,即类的变量,类中的数据成员,用来存储类所需的数据信息。它可以声明为静态的,也可以声明为只读的(readonly)。当字段被声明为只读时与声明为const的效果是一样的,区别在于只读型表达式在程序运行时形成,而const型表达式的值在编译时形成。只读型字段可以通过构造函数赋值,但实例创建后则不能再对其进行赋值。字段声明的格式如下:修饰符字段类型字段名列表;其中修饰符可以是public、protected、internal、private、static和readonly;字段类型可以是基本类型、用户自定义类型和其他类。例如:classCalendarDatepublicreadonlyintmonth;/只读字段,实例创建后不能对其赋值publicintday;publicstaticintyear=2005;/静态字段,属于类的成员虽然字段是一种类变量,但是C#为每个未初始化的变量都确认一个默认值,因此字段声明后便可以使用。这在一定程度上保证了程序的安全性。如下代码实例所示为字段使用的程序实例。,3.3字段,usingSystem;namespaceex_3_2classProgrampublicreadonlyintmonth;publicintday;publicstaticintyear=2005;publicProgram()/无参数的构造函数publicProgram(intd,intm,inty)/构造函数中可以对只读型字段赋值day=d;month=m;year=y;publicvoidPrint()Console.WriteLine(Yearis0,Monthis1,Dayis2,year,month,day);staticvoidMain(stringargs)Programp1=newProgram(10,10,2005);Programp2=newProgram();/字段具有默认值p1.Print();p2.Print();p1.day=11;/p1.month=11;/错误,只读型字段不能修改p1.Print();,3.4方法,方法是一种用于实现可以由对象或类执行的计算或操作的功能成员。与C+中的函数成员类似,方法可以是静态也可以是非静态。静态方法只能通过类来访问,非静态方法(即实例方法)则要通过类的实例访问。方法有一个参数表(可能为空),表示传递给方法的值或者引用;方法还有返回类型,用于指定由该方法计算和返回的值的类型。如果方法不返回值,则它的返回类型为void。方法的声明格式如下:修饰符返回类型方法名称(参数列表)方法体其中,方法的名称、参数个数、参数顺序、每个参数的修饰符和类型一起组成方法的签名。在声明方法的类中,该方法的签名必须是唯一的。正因为方法可以带参数,所以类中的方法可以重载,重载方法的签名不同,主要是参数个数、参数类型和参数顺序不同。,3.4方法,在C#中,方法中的参数用于将值或者引用变量传递给方法体。当方法被调用时,方法的参数从指定的自变量得到它们实际的值。C#中有4种参数:值参数、引用参数、输出参数和参量参数。值参数:用于输入参数的传递。值参数相当于一个局部变量,它的初始值是从实参获得的。对值参数的修改不会影响其对应的实参。引用参数:用于输入和输出数据的传递。引用参数对应的实参必须是一个变量,并且在方法执行期间,引用参数和其实参指向同一个存储空间,因此,引用参数值的变化将直接影响其实参。引用参数用ref修饰符声明。输出参数:用于输出数据的传递。输出参数类似于引用参数,不同之处在于实参有无初始值无关紧要。输出参数用out修饰符声明。参量参数:可以把一维数组或不规则数组传递给方法。在方法声明的参数列表中,参量参数必须以params开始,例如:publicintsum(paramintintParams)方法体。在带参量参数的方法调用中,既可以传递数组类型的单个实参,也可以传递充当数组元素的若干实参。对于后一种的情形,数组实例将自动被创建,并且通过给定的实参初始化。,3.4方法,usingSystem;namespaceex_3_3classFunc_Exstaticprivateintobject_num=0;/静态字段publicintx,y,xy;privateintm_sum;publicFunc_Ex(inta,intb)/构造函数x=a;y=b;object_num+;/统计对象实例个数publicvoidswap(inta,intb)/值参数inttemp;temp=a;a=b;b=temp;publicvoidswap(refinta,refintb,outints)/引用参数,输出参数inttemp;temp=a;a=b;b=temp;s=a+b;,publicvoidsum(paramsintintparams)/参量参数m_sum=0;foreach(intvinintparams)m_sum+=v;publicvoidprint()/实例方法Console.WriteLine(x=0,y=1,xy=2,sum=3,x,y,xy,m_sum);staticpublicvoidprintObjectNum()/静态方法Console.WriteLine(已创建的对象个数为0,object_num);staticvoidMain(stringargs)Func_Exf1=newFunc_Ex(10,20);Func_Ex.printObjectNum();f1.print();/静态方法调用f1.swap(f1.x,f1.y);/*值参数的方法调用*/f1.print();f1.swap(reff1.x,reff1.y,outf1.xy);/*引用和输出参数的方法调用*/f1.print();Func_Exf2=newFunc_Ex(100,220);Func_Ex.printObjectNum();/*静态方法调用*/f2.print();f2.sum(10,20,30,45);/*参量参数的方法调用*/f2.print();inta=1,3,5,7,9,11,23;f2.sum(a);/*参量参数的方法调用*/f2.print();,3.5属性与索引,3.5.1属性属性是对对象或类的字段进行特定访问的成员,是字段的自然扩展,并且访问属性和字段的语法相同。在C#中属性与字段完全相同,属性不表示存储位置。而且属性有访问器,通过这些访问器可以实现对相关字段值(或计算值)的访问。在C#中,属性的声明格式如下:修饰符类型属性名get执行代码;return表达式;set执行代码get访问器和set访问器的功能如下。get访问器相当于一个具有属性类型返回值的无参数方法。当在表达式中引用属性时,会调用该属性的get访问器来计算该属性的值。set访问器相当于一个具有单个名为value的参数和无返回类型的方法。当属性作为赋值运算的左值表达式或者作为+或运算符的操作数被引用时,就会调用set访问器来修改相应字段中的值。,3.5属性与索引,3.5.1属性两种访问器都包含的属性称为读写属性,只具有get访问器的属性称为只读属性,只具有set访问器的属性称为只写属性。与字段和方法类似,属性可以被定义为实例属性和静态属性。静态属性的声明中具有static修饰符,而实例属性则没有,静态属性只能访问静态成员。属性的访问器可以是虚拟的。当属性声明中包含virtual、abstract、override修饰符时,它们将运用到属性访问器。但是,与字段或方法不完全相同,属性声明时需要注意如下几点属性不能声明为const,也不能在一个表达式声明多个属性。不能通过set访问器对属性进行初始化。属性不属于变量,不能将属性作为引用参数或输出参数传递。属性必须有返回类型,并且不能为void型。在属性声明中,除了get和set访问器外,不能进行其他任何操作。,3.5属性与索引,3.5.2索引索引是这样一个成员,它使对象能够用与数组相同的方式进行索引。索引的声明与属性很相似,不同之处在于成员的名字是this,后面的参数列表在定界符“”之间。参数在索引的访问器中是可用的。索引的声明形式如下:修饰符类型this类型indexget执行代码;/主要是对index值指定的相应数组字段的某个元素进行访问return表达式;set执行代码;/主要是对index值指定的相应数组字段的某个元素进行访问如果包含get和set访问器,则该索引是读写索引;如果只包含get访问器则是只读索引;而只包含set访问器则是只写索引。注意:索引主要是用来通过数组下标的方式操作对象实例中的某个数组型字段成员的数组元素,而不是对象实例数组。,3.5属性与索引,usingSystem;namespaceEx_3_4classNameListprivatestringnamelist;/名称数组privatereadonlyintMaxLength;/数组最大长度privateintnamecount=0;/数组当前长度staticprivateintnamelistcount=0;/实例个数privatestringnamelisttile;/名称标题字段publicNameList(intmaxlength)/构造函数MaxLength=maxlength;namelist=newstringMaxLength;namecount=0;namelistcount+;staticpublicintNameListCount/静态属性getreturnnamelistcount;publicstringNameListTile/读写属性getreturnnamelisttile;setnamelisttile=value;publicintMAXLength/只读属性getreturnMaxLength;publicintCount/只读属性getreturnnamecount;,publicstringthisintindex/读写索引getif(index=0),3.5属性与索引,staticvoidMain(stringargs)/测试代码NameListnl1=newNameList(20);/创建两个对象NameListnl2=newNameList(10);nl1.NameListTile=NameBook1;for(inti=0;i10;i+)nl1.AddName(Name+i.ToString();nl2.NameListTile=NameBook2;for(inti=0;iemp2.m_salary)?true:false;classTeststaticpublicvoidSort(objectsortArray,CompareOpgtMethod)/使用委托做函数参数for(inti=0;isortArray.Length;i+)for(intj=i+1;jsortArray.Length;j+)if(gtMethod(sortArrayj,sortArrayi)objecttemp=sortArrayi;sortArrayi=sortArrayj;sortArrayj=temp;,3.6委托与事件,3.6.1委托,staticvoi
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 船厂入职考试题及答案大全
- 测量学仪器考试题及答案
- 高水平安全保障新质生产力
- 西北省份发展新质生产力
- 郑州新质生产力发展策略探析
- 工程力学 课件 柔索约束
- 2025年疼痛管理与镇痛药物应用评估模拟测试卷答案及解析
- 民族小学安全培训设施课件
- 2025年儿童保健与早期教育心理评估答案及解析
- 2025年老年医学老年痴呆症评估与干预模拟试卷答案及解析
- 感恩教师节幼儿园教师节
- 小学科学新教科版三年级上册全册教案(2025秋新版)
- 苏教版2025-2026秋三年级数学上册教学计划及课时安排
- 【里斯】年轻一代新能源汽车消费洞察与预测 -新物种 新理念 新趋势(2024-2025)
- 2025年综合基础知识题库(含答案)
- 医院意识形态培训课件
- DB32T3916-2020建筑地基基础检测规程
- 新苏教版六年级上册《科学》全一册全部课件(含19课时)
- 6人小品《没有学习的人不伤心》台词完整版
- 当代大学德语4答案
- 河南某高速公路改扩建工程盖板涵洞施工方案
评论
0/150
提交评论