第7章类与对象_第1页
第7章类与对象_第2页
第7章类与对象_第3页
第7章类与对象_第4页
第7章类与对象_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

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

文档简介

第7章类与对象【本章导读】本章通过对类和对象的学习,让读者掌握面向对象分析与面向对象程序设计的概念,掌握类和对象之间的关系,学习类、类成员、构造函数、方法重载、对象创建等基本知识,使得具备自定义类的基本技能。在第二篇学习的Windows窗体、用户界面控件、常用组件,都可以把他们看成一个一个的对象。在我们使用Windows窗体中的Button控件时,我们通过属性面板中的Text属性就可以修改显示在上面的文本,那么为什么可以达到这种功能呢?在计算机里面已经形成了Button类,在这个类里面封装好了一个名为Text的属性,只要我们修改了这个属性的值,计算机就会在按钮的面上显示出我们设定的值,实际上Button类中还封装了很多在我们编制程序的时候需要的功能。7.1面向对象分析与面向对象设计我们编制的C#应用程序中的类通常由我们程序员定义的类和.NETFramework类组成,而象Windows窗体中的Button控件就是.NETFramework提供的类。在本部分,我们将学习C#中自定义类和对象的相关知识。7.1面向对象分析与面向对象设计7.2案例:交通工具研究乘客数量、车轮数量、车牌号和车重等相关特性具有显示自我特性的方法具有超速时警示驾驶员的功能呢个问题:解决交通工具中客车的一些相关问题。7.2案例:交通工具-要解决的问题能显示该车能乘坐的乘客的数量、车轮数量、车牌号和车本身的重量,要求每次速度调整时能显示是否在安全行驶速度的范围内。本章我们将通过逐步讲解来完成本客车模型及其对象的创建。7.3.1类的定义

在类声明中需要使用关键字class,其简单的定义格式为: class类名 { 类体 }请思考:类是什么?为什么要创建类?怎么创建类?

7.3.1类的定义请注意:类体是以一对大括号开始和结束的,在一对大括号后面可以跟一个分号,也可以省略分号类体中的成员种类较多,常见的有字段、属性、方法和事件方法(Method)类的所有成员的声明均需在类体中7.3.1类的定义-【实作任务】定义的客车类 classPasstrain//类名为Passtrain(客车) { //成员字段 //成员属性 //成员方法 //成员事件 }定义了一个名为Passtrain的类,此时类体中未定义任何内容。但对于我们要定义的客车类的类体应该是不为空的,在下面我们将通过学习对客车类的字段、属性、方法和事件逐步完善。7.3.2字段字段是类成员中最基础也较重要的一个成员,是与对象或类相关联的变量。其作用主要是用于保存与类有关的一些数据。它的声明格式与普通变量的声明格式基本相同,声明位置没有特殊要求,习惯上将字段说明放在类体中的最前面。定义字段的基本格式为:

访问修饰符数据类型字段名

7.3.2字段先给出客车类的字段定义classPasstrain//类名为Passtrain(客车){//以下为成员字段----------------------------------------intweight;//此车的重量,privateintpassengers;//私有成员,标准容纳乘客数publicintwheels;//公有成员,该客车的轮子数 publicstringplate;//公有成员,车牌号}字段解析客车类模型Passtrain中定义了四个成员,分别用于保存客车的重量、可容纳的乘客数、轮子数和车牌号。在面向对象程序设计中,类里面的成员在定义时一般都要加上访问控制修饰符,以标志该成员在哪些范围能够被访问得到。若声明成员时没有使用任何修饰符,则该成员被人为是私有的(private)。声明类中的成员时,使用不同的访问修饰符,表示对类的访问权限不同,C#中常见的访问修饰符除及其意义:public访问不受限制,可以被任何其它类访问private访问只限于含该成员的类,及只有该类的其它成员能访问protected访问只限于含该成员的类、及该类的派生类注意:若字段定义前面的访问修饰符没有写出,则计算机会默认认为是私有字段private.对于公有访问(public)字段,我们可以通过“对象名.字段名”的形式访问,对于私有(private)和保护(protected)是不行的,如对于Passtrain的对象pss我们可以通过语句pss.wheels=4;为wheels字段赋值,而字段passengers是不行的。我们经常会看到在类前面有一个partial修饰符,该修饰符的作用允许将一个类分布到多个文件之中,在编译时会将各个部分再组合在一起。

7.3.3属性类字段一般定义为私有或受保护的,不容许外界访问。若需要外界访问此字段,我们可以利用本小节的属性知识,提供给外界访问私有或保护字段的途径。在前面第二篇中的5.2.2小节中我们通过设计器的属性面板如图7.2中的Text的更改从而可以修改窗体标题栏上的文本。采用的就是这种方法,这也是类模型设计的常见方法。图7-2属性面板7.3.3属性C#在类中声明属性的语法格式:访问修饰符类型属性名{get{return字段名;}set{字段名=value;}}7.3.3属性注意

实际上属性是一个或两个代码块,表示一个get访问器或一个set访问器。当读取属性时,执行get访问器的代码块;当赋予属性一个新值时,执行set访问器的代码块。不具有set访问器的属性被视为只读属性。不具有get访问器的属性被视为只写属性。同时具有这两个访问器的属性是读写属性。7.3.3属性【实作任务】客车类的属性声明classPasstrain//类名为Passtrain(客车){//以下为成员字段----------------------------------------intweight;//此车的重量,privateintpassengers;//私有成员,标准容纳乘客数publicintwheels;//公有成员,该客车的轮子数publicstringplate;//公有成员,车牌号//以下为成员属性----------------------------------------//以下声明公有访问属性以访问私有的weight成员7.3.3属性【实作任务】客车类的属性声明-续

publicintWeight{get{returnweight;}//提供对weight的读权限set{weight=value;}//提供对weight的写权限}//以下声明公有访问属性以访问私有的passengers成员publicintPassengers{get{returnpassengers;}//提供对passengers的读权限}}7.3.4方法在前面,我们学习了类成员中的字段和属性,通过它们我们可以完成数据的存放和读取,但若要完成其它的一些如显示、计算等功能时,我们还要利用到类中的第三个常见成员-方法。方法(method)是一种用于实现可以由对象或类执行的计算或操作的成员函数。在类中定义声明方法的基本语法格式为:

访问修饰符返回类型方法名([参数列表]){方法体}7.3.5构造函数与析构函数1.构造函数构造函数是一种特殊的方法成员,其主要作用是在创建对象时初始化对象,每个类都有构造函数,即使我们没有声明,编译器也会自动地为我们提供一个默认的构造函数,如果声明了构造函数,系统将不再提供默认构造函数。如果调用的是默认构造函数,在创建对象时,系统将不同类型的数据成员初始化为相应的默认值。例如,数值类型被初始化为0,字符串类型被初始化为null,逻辑类型被初始化为false.7.3.5构造函数与析构函数定义和使用构造函数时必须要注意以下几个问题一个类的构造函数通常与类名相同;构造函数不声明返回类型;一般地构造函数总是public类型的,如果是private类型的,表明类不能被实例化;在构造函数中不要做对类的实例进行初始化以外的事情,也不要尝试显式地调用构造函数。7.3.5构造函数与析构函数【实作任务】客车类有参数的构造函数和无参数的构造函数声明 //声明公有含参数的构造方法 //参数we,p,wh,sp分别传递车重,载客量,车轮,车牌号 publicPasstrain(intwe,intp,intwh,stringsp) { weight=we; wheels=wh; passengers=p; plate=sp; Console.WriteLine("客车类的有参构造函数被调用"); }7.3.5构造函数与析构函数【实作任务】续客车类有参数的构造函数和无参数的构造函数声明 //声明一个不含参数的构造方法 publicPasstrain() { weight=100; passengers=20; wheels=4; plate="000000"; Console.WriteLine("客车类的无参构造函数被调用"); }7.3.5构造函数与析构函数2.析构函数在类的实例超出某个范围时,我们总是希望它所占的存储能被收回,以便能节省出计算机的存储空间做其它的用途,C#提供了析构函数,用于专门释放被占用的系统资源。析构函数在设计时要注意名字与类名必须相同,同时在前面加符号~,析构函数不接受任何参数也不返回任何值,若试图声明其它任何一个以符号~开头,而不与类名相同的方法或者试图让析构函数返回一个值都是不行的。析构函数不能被继承而来的,也不能显式地调用,当某个类的实例被认为不再有效,垃圾收集器会帮助我们完成这些易被遗忘的工作。7.3.5构造函数与析构函数2.析构函数若我们为客车类编写析构函数则为:~Passtrain(){Console.WriteLine(“客车类的析构函数被调用!”);}7.4对象的创建 我们学习了类的声明,然而类是抽象的,要使用类定义的功能,就必须实例化类,即创建类的对象。类与对象的关系可以比喻为车型设计和具体的车:类就像车型设计一样说明了车所应该具备的所有属性和功能,但是车型设计并不是车,你不能发动和驾驶车型;对象就象根据车型设计制造出的车,它们都具备车型设计所描述的属性和功能,车是能发动和驾驶的。7.4.1类对象的创建

C#使用new运算符来创建类的对象,格式如下:

类名对象名=new类名([参数表]);也可以使用如下两步完成创建类的对象:

类名对象名; 对象名=new类名([参数表]);其中,[参数表]是可选的,根据类模型提供的构造函数来确定。声明类相当于定义一个模型,在类定义完毕之后使用new运算符创建类的对象(实例),计算机将为对象(实例)分配内存,并且返回对该对象(实例)的引用。7.4.1类对象的创建采用下面的语句创建Passtrain对象,并且将那些对象的引用保存到变量pss中:Passtrainpss=newPasstrain();//声明对象的同时实例化也可以使用如下语句: Passtrainpss; //先声明对象 pss=newPasstrain();//实例化对象7.4.1类对象的创建上面的语句newPasstrain()实例化时计算机会自动调用类Passtrain的无参构造函数实例化和初始化各个成员,若采用如下语句:Passtrainpss=newPasstrain(1000,20,4,"123456");

说明:此时计算机将会调用类Passtrain的有参数的构造函数实例化对象,并且将车重1000,车能容纳的人数20,车轮数4和车牌号”123456”按指定的输入进行初始化。7.4.2对象成员的引用访问形式正误分析pss.Showinfo()正确Showinfo为公有访问权限的方法,可输出对象pss的相关信息Console.Write(pss.Passengers)正确Passengers属性具有读取权限pss.Passengers=10错误Passengers属性不具有写权限,所以不能为其赋值Passtrainpss;pss=newPasstrain(23);错误类Passtrain未提供一个参数的构造函数7.4.2对象成员的引用注意创建类的对象、创建类的实例、实例化类等说法是等价的,都说明以类为模板生成了一个对象的操作。用new创建一个类的对象时,将在计算机中为对象分配一块内存,每一个对象都有不同的内存。代表对象的变量存储的是存放对象的内存的地址。因此,两个不同的对象,即使它们的所有成员的值或代码都相同,它们也是不相等的。就像同一型号的每一辆车都不相同一样,用同一个类创建出来的不同对象也是不同的。7.5类的成员访问与类访问修饰符类中成员定义时都需要指明访问修饰符,以标明此成员的访问范围。可以访问一个成员的代码范围叫做该成员的可访问域(accessibilitydomain)。访问修饰符用来控制所修饰成员的可访问域。访问修饰符使类或者类的成员在不同的范围内具有不同的可见性,用于实现数据和代码的隐藏。7.5类的成员访问与类访问修饰符类成员访问修饰符的意义:public访问不受限制,可以类内和任何类外的代码中访问protected可访问域限定于类内或从该类派生的类内private可访问域限定于它所属的类内internal可访问域限定于类所在的程序内,即当前项目中protectedinternal访问仅限于从包含类派生的当前项目或类型7.5类的成员访问与类访问修饰符类的访问修饰符:public访问不受限制,可以被任意存取protected只可以被本类和其继承子类存取internal只可以被本程序集内所有的类存取protectedinternal唯一的一种组合限制修饰符,它只可以被本程序集内所有的类和这些类的继承子类所存取private只可以被本类所存取new修饰符只能用于嵌套的类,表示对继承父类同名类型的隐藏abstract用来修饰抽象类,表示该类只能作为父类被用于继承,而不能进行对象实例化sealed用来修饰类为

温馨提示

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

评论

0/150

提交评论