欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > PPT文档下载  

    C#第6章面向对象程序设计.ppt

    • 资源ID:6502403       资源大小:269.99KB        全文页数:73页
    • 资源格式: PPT        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    C#第6章面向对象程序设计.ppt

    第6章面向对象程序设计,6.1 面向对象程序设计概述6.2 命名空间6.3 类6.4 对象6.5 构造函数和析构函数6.6 静态成员 6.7 属性6.8 方法 6.9 索引器6.10 委托6.11 事件6.12 运算符重载6.13 类的转换,6.1 面向对象程序设计概述,6.1.1 面向对象的基本概念 类和对象 属性、方法和事件 封装 继承 重载与重写,6.1.2 面向对象的优点 维护简单。可扩充性。代码重用。,6.2 命名空间,6.2.1 命名空间概述 在.NET中,类是通过命名空间(namespace)来组织的。命名空间提供了可以将类分成逻辑组的方法,将系统中的大量类库有序地组织起来,使得类更容易使用和管理。可以将命名空间想像成文件夹,类的文件夹就是命名空间,不同的命名空间内,可以定义许多类。在每个命名空间下,所有的类都是“独立”且“唯一”的。,6.2.2 使用命名空间 在C#中,使用命名空间有两种方式,一种是明确指出命名空间的位置,另一种是通过using关键字引用命名空间。直接定位在应用程序中,任何一个命名空间都可以在代码中直接使用。例如:System.Console.WriteLine(ABC);这个语句是调用了System命名空间中Console类的WriteLine方法。1)使用using关键字 在应用程序中要使用一个命名空间,还可以采取引用命名空间的方法,在引用后,应用程序中就可使用该命名空间内的任一个类了。引用命名空间的方法是利用using关键字,其使用格式如下:using 别名=命名空间或 using 别名=命名空间.成员,2)自定义命名空间 在C#中,除了使用系统的命名空间外,还可以在应用程序中自已声明命名空间。其使用语法格式如下:namespace命名空间名称 命名空间定义体 其中,“命名空间名称”指出命名空间的唯一名称,必须是有效的C#标识符。例如,在应用程序中自定义Ns1命名空间:namespace Ns1 class A class B,6.3类,6.3.1类的声明类的声明语法格式如下:类的修饰符 class 类名:基类名/类的成员;,例如,以下声明了一个Person类:public class Personpublic int pno;/编号 public string pname;/姓名public void setdata(int no,string name)pno=no;pname=name;public void dispdata()Console.WriteLine(0 1,pno,pname);,6.3.2类的成员,6.3.3 分部类分部类可以将类(结构或接口等)的声明拆分到两个或多个源文件中。若要拆分类的代码,被拆分类的每一部分的定义前边都要用partial关键字修饰。分部类的每一部分都可以存放在不同的文件中,编译时会自动将所有部分组合起来构成一个完整的类声明。,6.4对象,6.4.1 定义类的对象一旦声明了一个类,就可以用它作为数据类型来定义类对象(简称为对象)。定义类的对象分以下两步:1)定义对象引用其语法格式如下:类名 对象名;例如,以下语句定义Person类的对象引用p:Person p;2)创建类的实例其语法格式如下:对象名=new 类名();例如,以下语句创建Person类的对象实例:p=new Persone();,以上两步也可以合并成一步。其语法格式如下:类名 对象名=new 类名();例如:Person p=new Person();,理解对象引用和类实例的区别。,两个对象引用可以引用同一个对象,例如:Person p1=new Person();Person p2=p1;,6.4.2 访问对象的字段访问对象字段的语法格式如下:对象名.字段名其中,“.”是一个运算符,该运算符的功能是表示对象的成员。例如,前面定义的p对象的成员变量表示为:p.pno,p.pname,6.4.3 调用对象的方法调用对象的方法的语法格式如下:对象名.方法名(参数表)例如,调用前面定义的p对象的成员方法setdata为:p.setxy(101,Mary);,【例6.1】设计一个控制台应用程序,说明调用对象方法的过程。,using System;namespace Proj6_1public class TPoint/声明类TPoint int x,y;/类的私有字段 public void setpoint(int x1,int y1)x=x1;y=y1;public void dispoint()Console.WriteLine(0,1),x,y);class Program static void Main(string args)TPoint p1=new TPoint();/定义对象p1 p1.setpoint(2,6);Console.Write(第一个点=);p1.dispoint();TPoint p2=new TPoint();/定义对象p2 p2.setpoint(8,3);Console.Write(第二个点=);p2.dispoint();,6.5 构造函数和析构函数,6.5.1构造函数1.什么是构造函数 构造函数是在创建给定类型的对象时执行的类方法。构造函数具有如下性质:构造函数的名称与类的名称相同。构造函数尽管是一个函数,但没有任何类型,即它既不属于返回值函数也不属于void函数。一个类可以有多个构造函数,但所有构造函数的名称都必须相同,它们的参数各不相同,即构造函数可以重载。当类对象创建时,构造函数会自动地执行;由于它们没有返回类型,因此不能像其他函数那样进行调用。当类对象声明时,调用哪一个构造函数取决于传递给它的参数类型。构造函数不能被继承。,2.调用构造函数当定义类对象时,构造函数会自动执行。1)调用默认构造函数 不带参数的构造函数称为默认构造函数。无论何时,只要使用new运算符实例化对象,并且不为new提供任何参数,就会调用默认构造函数。假设一个类包含有默认构造函数,调用默认构造函数的语法如下:类名 对象名=new 类名();如果没有为对象提供构造函数,则默认情况下 C#将创建一个构造函数,该构造函数实例化对象,并将所有成员变量设置为相应的默认值。2)调用带参数的构造函数 假设一个类中包含有带参数的构造函数,调用这种带参数的构造函数的语法如下:类名 对象名=new 类名(参数表);,【例6.2】设计一个控制台应用程序,说明调用构造函数的过程。,namespace Proj6_2 class Program public class TPoint1/声明类TPoint1 int x,y;/类的私有变量 public TPoint1()/默认的构造函数 public TPoint1(int x1,int y1)/带参数的构造函数 x=x1;y=y1;public void dispoint()Console.WriteLine(0,1),x,y);static void Main(string args)TPoint1 p1=new TPoint1();/调用默认的构造函数 Console.Write(第一个点=);p1.dispoint();TPoint1 p2=new TPoint1(8,3);/调用带参数的构造函数 Console.Write(第二个点=);p2.dispoint();,6.5.2析构函数 1.什么是析构函数 在对象不再需要时,希望确保它所占的存储空间能被收回。C#中提供了析构函数用于专门释放被占用的系统资源。析构函数具有如下性质:析构函数在类对象销毁时自动执行。一个类只能有一个析构函数,而且析构函数没有参数,即析构函数不能重载。析构函数的名称是“”加上类的名称(中间没有空格)。与构造函数一样,析构函数也没有返回类型。析构函数不能被继承。,2.调用析构函数当一个对象被系统销毁时自动调用类的析构函数。,【例6.3】设计一个控制台应用程序,说明调用析构函数的过程。,using System;namespace Proj6_3 class Program public class TPoint2/声明类TPoint2 int x,y;public TPoint2(int x1,int y1)/带参数的构造函数 x=x1;y=y1;TPoint2()Console.WriteLine(点=(0,1),x,y);static void Main(string args)TPoint2 p1=new TPoint2(2,6);TPoint2 p2=new TPoint2(8,3);,6.6 静态成员,6.6.1 静态字段 静态字段是类中所有对象共享的成员,而不是某个对象的成员,也就是说静态字段的存储空间不是放在每个对象中,而是和方法一样放在类公共区中。对静态字段的操作和一般字段一样,定义为私有的静态字段不能被外界访问。静态字段的使用方法如下:(1)静态字段的定义与一般字段相似,但前面要加上static关键词。(2)在访问静态字段时采用如下格式:类名.静态字段名,6.6.2 静态方法 静态方法与静态字段类似,也是从属于类,都是类的静态成员。只要类存在,静态方法就可以使用,静态方法的定义是在一般方法定义前加上static关键字。调用静态方法的格式如下:类名.静态方法名(参数表);注意:静态方法只能访问静态字段、其他静态方法和类以外的函数及数据,不能访问类中的非静态成员(因为非静态成员只有对象存在时才有意义)。但静态字段和静态方法可由任意访问权限许可的成员访问。,6.7属性,6.7.1什么是属性 属性描述了对象的具体特性,它提供了对类或对象成员的访问。C#中的属性更充分地体现了对象的封装性,属性不直接操作类的字段,而是通过访问器进行访问。,6.7.2属性声明 属性在类模块里是采用下面的方式进行声明的,即指定变量的访问级别、属性的类型、属性的名称,然后是get访问器或者set访问器代码块。其语法格式如下:修饰符 数据类型 属性名称 get访问器 set访问器 其中,修饰符有new、public、protected、internal、private、static、virtual、override和abstract。,【例6.7】设计一个控制台应用程序,说明属性的使用。,using System;namespace Proj6_7 public class TPoint3/声明类TPoint3 int x,y;public int px get/get访问器 return x;set/set访问器 x=value;public int py get/get访问器 return y;set/set访问器 y=value;class Program static void Main(string args)TPoint3 p=new TPoint3();p.px=3;p.py=8;/属性写操作 Console.WriteLine(点=(0,1),p.px,p.py);/属性读操作,点=(3,8),6.8 方法,6.8.1 什么是方法 方法包含一系列的代码块。从本质上来讲,方法就是和类相关联的动作,是类的外部界面。用户可以通过外部界面来操作类的私有字段。,6.8.2 方法的定义定义方法的基本格式如下:修饰符 返回类型 方法名(参数列表)/方法的具体实现;,6.8.3 方法的返回值 方法可以向调用方返回某一个特定的值。如果返回类型不是void,则该方法可以用return关键字来返回值,return 还可以用来停止方法的执行。例如,以下类MyClass3中的addnum方法用return关键字来返回值:public class MyClass3 int num=0;public int addnum(int num1)return num+num1;,6.8.4 方法的参数 方法中的参数是保证不同的方法间互动的重要桥梁,方便用户对数据的操作。C#中方法的参数有4种类型。1.值参数 不含任何修饰符,当利用值向方法传递参数时,编译程序给实参的值做一份拷贝,并且将此拷贝传递给该方法,被调用的方法不会修改内存中实参的值,所以使用值参数时可以保证实际值的安全性。在调用方法时,如果形参的类型是值参数的话,调用的实参的表达式必须保证是正确的值表达式。例如,前面MyClass3类中addnum方法中的参数就是值参数。,2.引用型参数 以ref修饰符声明的参数属引用型参数。引用型参数本身并不创建新的存储空间,而是将实参的存储地址传递给形参,所以对形参的修改会影响原来实参的值。在调用方法前,引用型实参必须被初始化,同时在调用方法时,对应引用型参数的实参也必须使用ref修饰。例如:,public class MyClass4 int num=0;public void addnum(int num1,ref int num2)num2=num+num1;class Program static void Main(string args)int x=0;MyClass4 s=new MyClass4();s.addnum(5,ref x);Console.WriteLine(x);/输出:5,3.输出参数 以out修饰符声明的参数属输出参数。与引用型参数类似,输出型参数也不开辟新的内存区域。它与引用型参数的差别在于,调用方法前无需对变量进行初始化。输出型参数用于传递方法返回的数据,out修饰符后应跟随与形参的类型相同的类型,用来声明在方法返回后传递的变量经过了初始化。例如:,public class MyClass5 int num=0;public void addnum(int num1,out int num2)num2=num+num1;class Program static void Main(string args)int x;MyClass5 s=new MyClass5();s.addnum(5,out x);Console.WriteLine(x);/输出:5,4.数组型参数 以params修饰符声明的参数属数组型参数。params关键字可以指定在参数数目可变处采用参数的方法参数。在方法声明中的params关键字之后不允许任何其他参数,并且在方法声明中只允许一个params关键字。有数组型参数就不能再有ref 和out修饰符。例如:,public class MyClass6 int num=10;public void addnum(ref int sum,params int b)sum=num;foreach(int item in b)sum+=item;class Program static void Main(string args)int a=new int3 1,2,3;int x=0;MyClass6 s=new MyClass6();s.addnum(ref x,a);Console.WriteLine(x);,6.8.5 方法的重载 方法的重载是指调用同一方法名,但是使用不同的数据类型参数或者次序不一致的参数。只要一个类中有两个以上的同名方法,且使用的参数类型或者个数不同,编译器就可以判断在哪种情况下调用哪种方法了。为此,C#中引入了成员签名的概念。成员签名包含成员的名称和参数列表,每个成员签名在类型中必须是唯一的,只要成员的参数列表不同,成员的名称可以相同。如果同一个类有两个或多个这样的成员(方法、属性、构造函数等),它们具有相同的名称和不同的参数列表,则称该同类成员进行了重载,但它们的成员签名是不同的。例如,下面的代码实现了MethodTest方法的重载(假设都是某个类的成员),它们是不同的成员签名:,public int MethodTest(int i,int j)/重载方法1/代码public int MethodTest(int i)/重载方法2/代码public string MethodTest(string sr)/重载方法3/代码,6.9 索引器,6.9.1 什么是索引器 索引器提供了一种访问类或结构的方法,即允许按照与数组相同的方式对类、结构或接口进行索引。它的引入是为了使程序更加直观、易于理解。例如,可以有一个大学名称类University,其中有一个name数组字段可能包含一些大学名称,un是该类的一个对象,类中索引器允许访问这些大学名称,例如:un0=清华大学;un1=北京大学;un3=武汉大学;,6.9.2 定义索引器 要声明类或结构上的索引器,需使用this关键字,其语法格式如下:public int thisint index/索引器声明/get和set访问器 其中,this关键字引用类的当前实例。从中看到,索引器像对普通属性一样,为它提供get和set方法,这些访问器指定当使用该索引器时将引用到什么内部成员。例如,带有索引器的University类设计如下:,public class University const int MAX=5;private string name=new stringMAX;public string thisint index/索引器 get if(index=0,6.10委托,6.10.1 什么是委托 C+、Pascal和其他语言支持函数指针的概念,允许在运行时选择要调用的函数。Java不提供任何具有函数指针功能的结构,但C#提供这种构造。通过使用Delegate类,委托实例可以封装属于可调用实体的方法。委托具有以下特点:委托类似于C+函数指针,但它是类型安全的。委托允许将方法作为参数进行传递。委托可用于定义回调方法。委托可以链接在一起。例如,可以对一个事件调用多个方法。方法不需要与委托签名精确匹配。,6.10.2 定义和使用委托定义和使用委托有3个步骤,即声明、实例化和调用。1.声明委托类型 声明委托类型就是告诉编译器这种类型代表了哪种类型的方法。使用以下语法声明委托类型:修饰符 delegate 返回类型 委托类型名(参数列表);在声明一个委托类型时,每个委托类型都描述参数的数目和类型,以及它可以引用的方法的返回类型。每当需要一组新的参数类型或新的返回类型时,都必须声明一个新的委托类型。例如:private delegate void mydelegate(int n);上述代码声明了一个委托mydelegate,该委托类型可以引用一个采用int作为参数并返回void的方法。,2.实例化委托 声明了委托类型后,必须创建一个它的实例,即创建委托对象并使之与特定方法关联。定义委托对象的语法格式如下:委托类型名 委托对象名;例如,以下语句创建了mydelegate委托的一个委托对象p:mydelegate p;,另外,委托对象还需实例化为调用的方法,通常将这些方法放在一个类中(也可以将这些方法放在程序的Program类中),假设一个MyDeClass类如下:class MyDeClass public void fun1(int n)Console.WriteLine(0的2倍=1,n,2*n);public void fun2(int n)Console.WriteLine(0的3倍=1,n,3*n);,可以通过以下语句实例化委托对象p:MyDeClass obj=new MyDeClass();mydelegate p=new mydelegate(obj.fun1);其中,MyDeClass类中的fun1方法有一个int形参,其返回类型为void,它必须与mydelegate类型的声明相一致。,3.调用委托 创建委托对象后,通常将委托对象传递给将调用该委托的其他代码。通过委托对象的名称(后面跟着要传递给委托的参数,放在括号内)调用委托对象。其使用语法格式如下:委托对象名(实参列表);例如,以下语句调用委托p:p(100);委托对象是不可变的,即设置与它们匹配的签名后就不能再更改签名了。但是,如果其他方法具有同一签名,也可以指向该方法。例如:MyDeClass obj=new MyDeClass();mydelegate p=new mydelegate(obj.fun1);p(5);p=new mydelegate(obj.fun2);p(3);,【例6.9】设计一个控制台应用程序,说明委托的使用。,using System;namespace Proj6_9 delegate double mydelegate(double x,double y);/声明委托类型 class MyDeClass public double add(double x,double y)return x+y;public double sub(double x,double y)return x-y;public double mul(double x,double y)return x*y;public double div(double x,double y)return x/y;,class Program static void Main(string args)MyDeClass obj=new MyDeClass();mydelegate p=new mydelegate(obj.add);Console.WriteLine(5+8=0,p(5,8);p=new mydelegate(obj.sub);Console.WriteLine(5-8=0,p(5,8);p=new mydelegate(obj.mul);Console.WriteLine(5*8=0,p(5,8);p=new mydelegate(obj.div);Console.WriteLine(5/8=0,p(5,8);,前面代码中p作为引用类型,也可以改为值类型,等价的主函数可以如下改为:static void Main(string args)MyDeClass obj=new MyDeClass();mydelegate p=obj.add;Console.WriteLine(5+8=0,p(5,8);p=obj.sub;Console.WriteLine(5-8=0,p(5,8);p=obj.mul;Console.WriteLine(5*8=0,p(5,8);p=obj.div;Console.WriteLine(5/8=0,p(5,8);,6.10.3 委托对象封装多个方法 委托对象可以封装多个方法,这些方法的集合称为调用列表。委托使用“+”、“-”、“+=”和“-=”等运算符向调用列表中增加或移除事件处理方法。,【例6.10】设计一个控制台应用程序,说明委托对象封装多个方法的使用。,using System;namespace Proj6_10 delegate void mydelegate(double x,double y);/声明委托类型 class MyDeClass public void add(double x,double y)Console.WriteLine(0+1=2,x,y,x+y);public void sub(double x,double y)Console.WriteLine(0-1=2,x,y,x-y);public void mul(double x,double y)Console.WriteLine(0*1=2,x,y,x*y);public void div(double x,double y)Console.WriteLine(0/1=2,x,y,x/y);,class Program static void Main(string args)MyDeClass obj=new MyDeClass();mydelegate p,a;a=obj.add;p=a;/将add方法添加到调用列表中 a=obj.sub;p+=a;/将sub方法添加到调用列表中 a=obj.mul;p+=a;/将mul方法添加到调用列表中 a=obj.div;p+=a;/将div方法添加到调用列表中 p(5,8);,6.10.4 使委托与匿名方法关联 所谓匿名方法就是没有方法名称的方法。当将委托与匿名方法关联时,直接给出方法的函数体,其一般语法格式如下:delegate 返回类型 委托类型名(参数列表);委托类型名 委托对象名=返回类型(参数列表)/*匿名方法代码*/;托对象名(实参列表)第1个语句声明委托类型;第2个语句定义匿名方法并将其与委托对象关联;第3个语句调用委托。,例如,以下程序段就是使委托与匿名方法关联,并调用该委托:delegate void mydelegate(string mystr);/声明委托类型 class Program static void Main(string args)mydelegate p=delegate(string mystr)Console.WriteLine(mystr);p(String);/输出:String,6.11事件,6.11.1 什么是事件 事件是类在发生其关注的事情时用来提供通知的一种方式。例如,封装用户界面控件的类可以定义一个在用户单击时候发生的一个事件。控件类不关心单击按钮时候发生了什么,但是它需要告知派生类单击事件已经发生,然后,派生类可以选择如何响应。当发生与某个对象相关的事件时,类和结构会使用事件将这一个对象通知给用户。这种通知即为引发事件。引发事件的对象称为事件的源或者发送者。对象引发事件的原因很多,如响应时丢失网络连接就会引发一个事件。表示用户界面元素的对象通常会引发事件来响应用户的操作,如按钮单击或者菜单选择。,6.11.2 事件的创建和使用 下面介绍在C#中创建和使用事件的步骤。1.为事件创建一个委托类型 所有事件是通过委托来激活的,其返回值类型一般为void型。为事件创建一个委托类型的语法格式如下:delegate void 委托类型名(触发事件的对象名,事件参数);例如,以下语句创建一个委托类型mydelegate,其委托的事件处理方法返回类型为void,不带任何参数:public delegate void mydelegate();,2.创建事件处理的方法 当事件触发时要调用事件处理方法,需设计相应的事件处理方法,可以将它放在单独的类中,也可以放在触发事件的类中。例如,以下设计一个包含事件处理方法的单独类 class MyEventHander public void OnHandler1()Console.WriteLine(调用OnHandler1方法);,3.声明事件 事件是类成员,以关键字event声明,其一般语法格式如下:修饰符 event 委托类型名 事件名;其中,“修饰符”指出类的用户访问事件的方式,可以为public、private、protected、internal、protectedinternal、static或virtual等。一般在声明事件的类中包含触发事件的方法。例如,以下MyEvent类包含事件声明和触发该事件的方法:MyEvent/事件类 public event mydelegate1 Event1;/声明事件public void FireEvent1()/调用这个方法来触发事件Event1 if(Event1!=null)Event1();/Event1事件发生,4.通过委托对象来调用被包含的方法 向类事件(列表)中添加事件处理方法中的一个委托,这个过程称为订阅事件,这个过程通常是在主程序中进行的,首先必须声明一个包含事件的类的对象,然后将事件处理方法和该对象关联起来,其格式如下:事件类对象名.事件名+=new 委托类型名(事件处理方法);其中,还可以使用“-=”、“+”、“-”等运算符添加或删除事件处理方法。最后调用触发事件的方法便可触发事件。例如,以下语句就是触发前面创建的事件Event1,并在屏幕上显示“调用OnHandler1方法”:MyEvent b=new MyEvent();MyEventHander a=new MyEventHander();b.Event1+=new mydelegate1(a.OnHandler1);/把方法OnHandler1添加到事件列表中 b.FireEvent1();/调用触发事件的方法,【例6.11】设计一个控制台应用程序,说明事件的使用。,using System;namespace Proj6_11 public delegate void mydelegate(int c,int n);/声明一个事件委托类型 public class Shape protected int color;public event mydelegate ColorChange;/声明一个事件 public int pcolor/定义属性 set int ocolor=color;/保存原来的颜色 color=value;ColorChange(ocolor,color);/在color的值发生改变后,触发事件。get return color;public Shape()/构造函数 color=0;,class Program static void Main(string argvs)Shape obj=new Shape();obj.ColorChange+=new mydelegate(CCHandler);/订阅事件 obj.pcolor=3;/改变颜色触发事件 static void CCHandler(int c,int n)/事件处理方法 Console.WriteLine(颜色从0改变为1,c,n);,执行结果:颜色从0改变为3,6.12 运算符重载,6.12.1 运算符重载概述运算符重载是指同名运算符可用于运算不同类型的数据。C#允许重载运算符,以供自己的类使用。其目的是让使用类对象像使用基本数据类型一样自然、合理。例如,设计一个名称为MyAdd的类,其中对“+”运算符进行了重载,这样对于该类的两个对象a和b,就可以进行a+b的运算。若要重载某个运算符,需要编写一个函数,其基本语法格式如下:public static 返回类型 operator 运算符(参数列表),所有运算符重载均为类的静态方法。在C#中不是所有的运算符都允许重载,以下是可重载的运算符的完整列表:一元运算符:+、-、!、+、-、true、false。二元运算符:+、-、*、/、%、&、|、=、!=、=、运算符以及=运算符也必须成对重载。,6.12.2 一元运算符重载 一元运算符重载时需注意以下几点:一元运算符+、-、!、必须使用类型T的单个参数,可以返回任何类型。一元运算符+、-必须使用类型T的单个参数,并且要返回类型T。一元运算符true、false必须使用类型T的单个参数,并且要返回类型bool。例如,设计如下类MyOp,其中对一元运算符“+”进行了重载:class MyOpprivate int n;public MyOp(int n1)n=n1;public static MyOp operator+(MyOp obj)return new MyOp(obj.n+1);public void dispdata()Console.WriteLine(n=0,n);,执行以下语句:MyOp a=new MyOp(2);a+;a.dispdata();由于类MyOp中对运算符“+”进行了重载,所以可以执行a+语句,其功能是将a的私有字段n增1。上述语句的输出结果为:n=3。,6.12.3 二元运算符重载 一个二元运算符必须有两个参数,而且其中至少一个必须是声明运算符的类或结构的类型。二元运算符可以返回任何类型。二元运算符的签名由运算符符号和两个形式参数组成。例如,设计如下类MyOp1,其中对二元运算符“+”进行了重载:,class MyOp1 private int n;public MyOp1()public MyOp1(int n1)n=n1;public static MyOp1 operator+(MyOp1 obj1,MyOp1 obj2)return new MyOp1(obj1.n+obj2.n);public void dispdata()Console.WriteLine(n=0,n);执行以下语句:MyOp1 a=new MyOp1(2),b=new MyOp1(3),c;c=a+b;c.dispdata();,6.13 类的转换,6.13.1 关键字is is是一个检查引用变量的类型的运算符,在第3章中介绍过,它用来检查对象是否与给定数据类型兼容。如果所提供的表达式非空,并且所提供的对象可以强制转换为所提供的类型而不会导致引发异常,则is表达式的计算结果将是true。如果已知表达式将始终是true或者false,则is关键字将导致编译时警告,但是,通常在运行时才计算类型兼容性。is运算符不能重载。,例如:if(o is A)/如果o属A类类型Console.WriteLine(o属A类类型);a=(A)o;/强制转换为a对象引用 a.funa();else if(o is B)/如果o属B类类型 Console.WriteLine(o属B类类型);b=(B)o;/强制转换为b对象引用 b.funb();else Console.WriteLine(o不属于A和B类类型);,6.13.2 关键字as as用于在兼容的引用类型之间执行转换。例如:string s=someObject as string;as运算符类似于强制转换,所不同的是,当转换失败时,运算符将产生空(null),而不是引发异常。as的语法格式如下:表达式 as 数据类型等效于 表达式 is 数据类型?(数据类型)表达式:(数据类型)null其中,“表达式”只被计算一次。注意:as运算符只执行引用转换和装箱转换。as运算符无法执行其他转换,如用户定义的转换,这类转换应使用cast表达式来执行。例如,以下语句将obj对象转换成string时返回null:MyClass obj=new MyClass();string s=obj as string;/s为null,例如:a=b as A;/将b强制转换为A对象a,

    注意事项

    本文(C#第6章面向对象程序设计.ppt)为本站会员(牧羊曲112)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开