第四面向对象编程进阶ppt课件_第1页
第四面向对象编程进阶ppt课件_第2页
第四面向对象编程进阶ppt课件_第3页
第四面向对象编程进阶ppt课件_第4页
第四面向对象编程进阶ppt课件_第5页
已阅读5页,还剩62页未读 继续免费阅读

下载本文档

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

文档简介

1、本章学习目的本章学习目的了解类的承继与多态的概念了解类的承继与多态的概念熟习类型转换的方法熟习类型转换的方法掌握构造与接口的定义及用法掌握构造与接口的定义及用法掌握异常处置的方法掌握异常处置的方法掌握委托的定义及用法掌握委托的定义及用法第四章第四章 面向对象编程进阶面向对象编程进阶4.1 类的承继与多态类的承继与多态4.3 类型转换类型转换4.4 构造与接口构造与接口4.6 异常处置异常处置4.7 委托委托4.1 类的承继与多态类的承继与多态4.1.1 承继承继4.1.2 多态多态4.1.1 承继承继 类的承继性:类的承继性:C#允许基于某一个曾经定义的类来创建一允许基于某一个曾经定义的类来创

2、建一个新类。个新类。 基类:被承继的类,即父类。基类:被承继的类,即父类。 派生类:承继的类,即子类。派生类:承继的类,即子类。4.1.1 承继承继访问修饰符访问修饰符 class 类名类名 : 基类基类 类主体类主体 访问修饰符:访问修饰符:public:表示不限制对类的访问;:表示不限制对类的访问;internal:可被同一个工程的程序访问;:可被同一个工程的程序访问;sealed: 表示一个密封类,不能被承继。表示一个密封类,不能被承继。 阐明:假设对类不指定访问修饰符,那么类的默许访问修饰符为阐明:假设对类不指定访问修饰符,那么类的默许访问修饰符为internal 定义派生类定义派生类

3、4.1.1 承继承继 class Person public string name; protect string sex; int age; class Student : Person string stuNo; string classNo; 定义派生类定义派生类4.1.1 承继承继派生类只能承继于一个基类;派生类只能承继于一个基类;派生类自然承继基类的成员,但不能承继基类的构造函数成员;派生类自然承继基类的成员,但不能承继基类的构造函数成员;类的承继可以传送。如类的承继可以传送。如C类承继类承继B类,类,B类承继类承继A类,那么类,那么C类具类具有有B类和类和A类的成员;类的成员;派

4、生类是对基类的扩展,派生类定义中可以声明新的成员;派生类是对基类的扩展,派生类定义中可以声明新的成员;派生类定义中假设声明了与基类同名的成员,那么基类的同名成派生类定义中假设声明了与基类同名的成员,那么基类的同名成员将被隐藏,从而使派生类不能直接访问同名的基类的成员;员将被隐藏,从而使派生类不能直接访问同名的基类的成员;基类可以定义虚方法成员等,这样派生类可以覆盖这些成员以表基类可以定义虚方法成员等,这样派生类可以覆盖这些成员以表现类的多态性。现类的多态性。类的承继规那类的承继规那么么4.1.1 承继承继派生类构造函数派生类构造函数 默许执行基类的无参构造函数,假设要执行基类有参构默许执行基类

5、的无参构造函数,假设要执行基类有参构造函数,那么必需在派生类构造函数的基表列表中指出;造函数,那么必需在派生类构造函数的基表列表中指出; 构造函数调用顺序:先基类后派生类。构造函数调用顺序:先基类后派生类。 派生类析构函数派生类析构函数 析构函数调用顺序:先派生类后基类。析构函数调用顺序:先派生类后基类。4.1.1 承继承继base 在派生类中调用基类方法在派生类中调用基类方法 在构造函数中显式调用基类构造函数在构造函数中显式调用基类构造函数 public 派生类名派生类名(形参列表形参列表): base(基类构造函基类构造函数实参列表数实参列表) 在方法中调用基类方法在方法中调用基类方法 b

6、ase.基类方法名基类方法名(参数表参数表)4.1.1 承继承继隐藏隐藏隐藏隐藏自动隐藏与基类同名的成员自动隐藏与基类同名的成员声明成员时,显式运用声明成员时,显式运用new修饰符修饰符隐藏本质上是使承继的成员在派生类成为不可见的。隐藏隐藏本质上是使承继的成员在派生类成为不可见的。隐藏的成员并没有被删除,只是不能从派生类直接访问,经过基类的成员并没有被删除,只是不能从派生类直接访问,经过基类可以直接访问它。可以直接访问它。4.1.2 多态多态 编译时实现的多态:编译时实现的多态: 假设一个类中有两个或两个以上的方法的名字一样,而它假设一个类中有两个或两个以上的方法的名字一样,而它们的形参个数或

7、形参类型有所不同,在程序编译时可以正们的形参个数或形参类型有所不同,在程序编译时可以正确区别他们;确区别他们; 运转时实现的多态:运转时实现的多态: 指在程序运转时,基类对象执行一个基类与派生类都具有指在程序运转时,基类对象执行一个基类与派生类都具有的同名方法调用时,程序可以根据基类对象类型的不同的同名方法调用时,程序可以根据基类对象类型的不同基类还是派生类进展正确的调用。基类还是派生类进展正确的调用。 实现方法:虚方法、笼统方法实现方法:虚方法、笼统方法4.1.2 多态多态虚方法虚方法public virtual 前往类型前往类型 方法名参数列表方法名参数列表 方法体方法体 基类中定义虚方法

8、基类中定义虚方法public override 前往类型前往类型 方法名参数列表方法名参数列表 方法体方法体 派生类中重写基类中定义虚方法派生类中重写基类中定义虚方法4.1.2 多态多态虚方法虚方法几点阐明:几点阐明:基类与派生类中的方法名、参数列表、前往类基类与派生类中的方法名、参数列表、前往类型必需完全一致;型必需完全一致;可被重写的基类方法是虚方法、笼统方法或重可被重写的基类方法是虚方法、笼统方法或重写方法写方法override修饰修饰virtual不能与不能与static、abstract或或override中任中任一个同时出现;一个同时出现;override不能与不能与new、sta

9、tic、virtual或或abstract中任一个同时运用;中任一个同时运用;4.1.2 隐藏与多态实例隐藏与多态实例隐藏与多态隐藏与多态class A public void E() Console.WriteLine(“A.E); public void F() Console.WriteLine(“A.F); public virtual void G() Console.WriteLine(“A.G); class B:A public void E() Console.WriteLine(“B.E); public new void F() Console.WriteLine(“B.

10、F); public override void G() Console.WriteLine(“B.G); class Test public static void Main() B b=new B(); A a=b; a.E(); b.E(); a.F(); b.F(); a.G(); b.G(); 输出结果:输出结果:A.EB.EA.FB.FB.GB.G父类可以援用子类对象,父类援用只能调用子类承继自父类的方法,父类可以援用子类对象,父类援用只能调用子类承继自父类的方法,父类不能调用子类独有的方法。父类不能调用子类独有的方法。4.1.2 隐藏与多态实例隐藏与多态实例隐藏与多态隐藏与多态c

11、lass A public virtual void F() Console.WriteLine(“A.F); class B:A public override void F() Console.WriteLine(“B.F); class C :B new public virtual void F() Console.WriteLine(“C.F); class D :C public override void F() Console.WriteLine(“D.F); class Test public static void Main() D d=new D(); A a=d; B

12、b=d; C c=d; a.F(); b.F(); c.F(); d.F(); 输出结果:输出结果:B.FB.FD.FD.F4.1.2 多态多态笼统类与笼统方法笼统类与笼统方法 笼统类:是一种特殊的基类,该类并不与详细的事物发生笼统类:是一种特殊的基类,该类并不与详细的事物发生联络;例如几何体,计算几何体体积的方法不能够有详细联络;例如几何体,计算几何体体积的方法不能够有详细实现过程,只需详细某一种几何体才有求体积的方法;实现过程,只需详细某一种几何体才有求体积的方法; 笼统类是指在基类的定义中声明不包含任何实现代码的方笼统类是指在基类的定义中声明不包含任何实现代码的方法,实践上就是一个不具有

13、任何详细功能的方法,即笼统法,实践上就是一个不具有任何详细功能的方法,即笼统方法。该方法的独一作用就是让派生类来重写;方法。该方法的独一作用就是让派生类来重写; 在基类定义中,只需类体中包含一个笼统方法,该类即为在基类定义中,只需类体中包含一个笼统方法,该类即为笼统类。笼统类。4.1.2 多态多态笼统类与笼统方法笼统类与笼统方法public abstract class 类名类名 public abstract 前往类型前往类型 方法称号参数列表;方法称号参数列表; 声明笼统类与笼统方法声明笼统类与笼统方法不包含方法体,不包含方法体, 也不能要也不能要4.1.2 多态多态笼统类与笼统方法笼统类

14、与笼统方法笼统类几点阐明笼统类几点阐明一个类中只需包含一个笼统方法,该类即为笼统类;反之一个类中只需包含一个笼统方法,该类即为笼统类;反之,一个笼统类中必需包含笼统方法;,一个笼统类中必需包含笼统方法;笼统类中可以包含非笼统方法;笼统类中可以包含非笼统方法;笼统类不能实例化,不能用笼统类不能实例化,不能用new生成实例;生成实例;笼统类不能被密封。笼统类不能被密封。派生类阐明派生类阐明假设基类为笼统类,那么要求派生类必需重载实现基类中假设基类为笼统类,那么要求派生类必需重载实现基类中一切笼统方法。一切笼统方法。笼统方法阐明笼统方法阐明笼统方法没有方法体,只需一个方法头后跟一个分号;笼统方法没有

15、方法体,只需一个方法头后跟一个分号;笼统方法被隐含以为是一种虚方法,派生类中必需重写一笼统方法被隐含以为是一种虚方法,派生类中必需重写一切笼统方法,且重写的方法与笼统方法的参数及类型、方切笼统方法,且重写的方法与笼统方法的参数及类型、方法名都应一样。法名都应一样。4.1.2 多态多态笼统类与笼统方法笼统类与笼统方法public abstract class Shape protected double x; protected double y; protected double z; public Shape(double dx, double dy, double dz) x=dx; y=

16、dy; z=dz; public abstract double Cubage();定义笼统类及笼统方法定义笼统类及笼统方法4.1.2 多态多态笼统类与笼统方法笼统类与笼统方法public class Cuboid:Shape public Cuboid(double dx, double dy, double dz) :base(dx,dy,dz) public override double Cubage() return x * y * z; 重载笼统方法重载笼统方法4.1.2 多态多态笼统类与笼统方法笼统类与笼统方法 虚方法与笼统方法区别虚方法与笼统方法区别 笼统方法必需在笼统类中定义

17、,虚方法可以在笼统类或普笼统方法必需在笼统类中定义,虚方法可以在笼统类或普通类中定义;通类中定义; 在基类中,虚方法用在基类中,虚方法用virtual关键字,笼统方法用关键字,笼统方法用abstract关键字;关键字; 在派生类中,虚方法不一定重写,笼统方法一定要重写;在派生类中,虚方法不一定重写,笼统方法一定要重写;修饰符小结修饰符小结基类方法基类方法abstractvirtualoverride无阐明符无阐明符new(无阐明符无阐明符)override派生类方法派生类方法4.1.2 多态多态密封类和密封方法密封类和密封方法密封类:不允许被承继的类。密封类:不允许被承继的类。定义密封类定义密

18、封类访问修饰符访问修饰符 sealed class 类称号类称号 类体类体 public sealed class SealedClass public string method( ) return 我是密封类我是密封类; 定义密封类定义密封类4.1.2 多态多态密封类和密封方法密封类和密封方法 基类中要密封的方法必需有基类中要密封的方法必需有virtual、abstract或或override 派生类中的密封方法必需同时有派生类中的密封方法必需同时有sealed override。定义密封方法定义密封方法访问修饰符访问修饰符 sealed override 前往类型前往类型 方法名参数列表

19、方法名参数列表 方法体方法体 4.1.2 多态多态密封类和密封方法密封类和密封方法密封方法密封方法class A public virtual void F() Console.WriteLine(“A.F); class B:A public sealed override void F() Console.WriteLine(“B.F); class C :B public override void F() Console.WriteLine(“C.F); class Test public static void Main() C c=new C(); c.F(); sealed必需与

20、必需与override同时出现同时出现不允许重写不允许重写F方法方法假设无假设无override那么为那么为隐藏隐藏4.3 类型转换类型转换4.3.1 隐式类型转换隐式类型转换4.3.2 显式类型转换显式类型转换4.3.3 运用运用Convert转换转换为什么需求类型转换为什么需求类型转换编译器要确切地知道数据的类型编译器要确切地知道数据的类型int num = 123 ;整数整数字符串字符串需求类型转换!需求类型转换!编译出错编译出错4.3.1 隐式类型转换隐式类型转换隐式转换:自动类型转换隐式转换:自动类型转换规那么:对于数值类型,规那么:对于数值类型,A的取值范围完全包含在的取值范围完全

21、包含在B内内ABstatic void Main(string args) double score = 58.5; / 原始成果原始成果 int bonus = 2; / 加分加分 int sum; / 总分总分 sum = score + bonus; / 计算总分计算总分 Console.WriteLine(sum); Console.ReadLine();4.3.2 显式类型转换显式类型转换static void Main(string args) double score = 58.5; int bonus = 2; int sum; sum = (int)score + bonus

22、; Console.WriteLine(sum); Console.ReadLine();明确通知编译器转换类型明确通知编译器转换类型留意:留意:double (58.5)-int (58),精度能够丧失!,精度能够丧失!显式转换:强迫类型转换显式转换:强迫类型转换运用运用 Parse() 进展转换进展转换字符串和数值型的相互转换字符串和数值型的相互转换 int.Parse( )float.Parse( )double.Parse( )ToString()必需是数字的必需是数字的有效表示方式!有效表示方式!4.3.3 运用运用 Convert 类进展转换类进展转换 运用 Convert :Co

23、nvert.ToXxx(object value)Convert.ToInt32()Convert.ToSingle()Convert.ToString()double85.63string85.63int86float85.63Parse 与与 ConvertXxx.Parse(string)目的类型的有效表示方式目的类型的有效表示方式 Convert.ToXxx(object):注:注:Xxx表示某种类型表示某种类型字符串字符串其他类型其他类型恣意类型恣意类型其他类型其他类型4.4 构造与接口构造与接口访问修饰符访问修饰符struct 构造名构造名 构造主体构造主体 访问修饰符:访问修饰符

24、:public:表示不限制对构造的访问;:表示不限制对构造的访问;internal: 可被同一个工程的程序访问默许;可被同一个工程的程序访问默许;构呵斥员包括字段、属性、方法等;构呵斥员包括字段、属性、方法等;构造可以定义构造函数,但不能定义析构函数;构造可以定义构造函数,但不能定义析构函数;有一个默许的不带参数的构造函数,有一个默许的不带参数的构造函数, 用于对构造的字段进展初始化,并用于对构造的字段进展初始化,并且构造的默许构造函数不能被重写。且构造的默许构造函数不能被重写。构造的声明构造的声明4.4 构造与接口构造与接口构造与类的区别构造与类的区别结结 构构类类值类型值类型引用类型引用类

25、型可以不使用可以不使用new实例化实例化必须使用必须使用new初始化初始化不可以添加无参构造函数不可以添加无参构造函数可以添加无参构造函数可以添加无参构造函数没有析构函数没有析构函数有析构函数有析构函数没有没有abstract,protected和和sealed修饰符修饰符可以使用可以使用abstract,protected和和sealed修饰符修饰符不支持继承不支持继承支持继承支持继承适用于表示小的数据结构适用于表示小的数据结构适用于表示任何数据结构适用于表示任何数据结构4.4 构造与接口构造与接口struct account public string name; public doubl

26、e balance; public account(string n,double b) name=n;balance=b; 构造定义及运用一构造定义及运用一4.4 构造与接口构造与接口构造定义及运用构造定义及运用( (一续一续class Test public static void Main() account acc1=new account(“张三,张三,3000); /显式构造函数显式构造函数 account acc2=new account(); /缺省构造函数缺省构造函数account acc3; /没有构造函数没有构造函数Console.WriteLine(+

27、“has a balance of +acc1.balance);if(=null) Console.WriteLine(“ is null); Console.WriteLine(“acc2.balance is +acc2.balance); /运用运用acc3以前,必需初始化以前,必需初始化acc3 =“Mary; acc3.balance=2000; Console.WriteLine(+“has a balance of +acc3.balance); 4.4 构造与接口构造与接口struct MyStruct

28、public int x; public int y; public MyStruct(int i, int j)x = i;y = j; public void Sum() int sum=x+y; Console.WriteLine(“The sum is 0,sum); 构造定义及运用二构造定义及运用二4.4 构造与接口构造与接口class Test static void Main() MyStruct s1 = new MyStruct(1,2); MyStruct s2 = s1; s1.x = 2; s1.Sum(); s2.Sum(); 构造定义及运用二续构造定义及运用二续输出

29、结果:输出结果:The sum is 4The sum is 3值传送值传送4.4 构造与接口构造与接口 接口声明定义了一个协定,运用接口的类或构造必需遵守接口声明定义了一个协定,运用接口的类或构造必需遵守其协定。接口可以从多个基接口承继,而类或构造可以实其协定。接口可以从多个基接口承继,而类或构造可以实现多个接口;现多个接口; 接口成员只能是方法、属性、索引和事件,不能有字段。接口成员只能是方法、属性、索引和事件,不能有字段。 接口本身不提供它所定义成员的实现代码,只指定实现该接口本身不提供它所定义成员的实现代码,只指定实现该接口的类或构造必需提供的成员的调用方式。接口的类或构造必需提供的成

30、员的调用方式。4.4 构造与接口构造与接口访问修饰符访问修饰符 interface 接口名接口名 :基接口:基接口1,基接口,基接口2. 接口体接口体 访问修饰符:访问修饰符:public:表示不限制对类的访问;:表示不限制对类的访问;internal: 可被同一个工程的程序访问默许;可被同一个工程的程序访问默许;接口成员包括属性、方法等;接口成员包括属性、方法等;接口不能包括字段,也不能定义构造函数和析构函数;接口不能包括字段,也不能定义构造函数和析构函数;接口成员访问修饰符默以为接口成员访问修饰符默以为public;接口的命名通常是以接口的命名通常是以I开头,如开头,如IPartA。接口的

31、声明接口的声明4.4 构造与接口构造与接口 接口的实现接口的实现 函数成员的实现:类、构造;函数成员的实现:类、构造; 实现接口类型:实现接口类型: public成员实现成员实现 显示接口成员实现显示接口成员实现 不能用不能用new操作符创建接口的实例操作符创建接口的实例4.4 构造与接口构造与接口 public成员实现成员实现 实现接口成员时,声明成员为实现接口成员时,声明成员为public,这样的实,这样的实现声明称为现声明称为public接口成员实现声明,简称接口成员实现声明,简称public成员实现或成员实现或public实现实现; public实现的成员具有双重访问性,由于它是接实现

32、的成员具有双重访问性,由于它是接口成员的实现,所以可以经过接口实例来访问,口成员的实现,所以可以经过接口实例来访问,又由于它是又由于它是public成员,还可以经过类或构造的成员,还可以经过类或构造的实例来访问。实例来访问。4.4 构造与接口构造与接口interface IA void p();class B:IA public void p() /代码实现代码实现 class Test public static void Main() B b=new B(); b.p(); IA a=b; a.p(); public成员实现成员实现(一一)正确正确正确正确4.4 构造与接口构造与接口pub

33、lic成员实现二成员实现二interface IPoint int Xget;set; int Yget;set;class MyPoint:IPoint private int myX,myY; public MyPoint(int x,int y) myX=x;myY=y; public int X /对属性对属性X的的public实现声明实现声明 getreturn myX; setmyX=value; public int Y /对属性对属性Y的的public实现声明实现声明 getreturn myY; setmyY=value; 4.4 构造与接口构造与接口class MainCl

34、ass /经过接口调用经过接口调用 public static void PrintPoint(IPoint p) Console.WriteLine(“x=0,y=1,p.X,p.Y); public static void Main() MyPoint p=new MyPoint(2,3); Console.Write(“MyPoint:); PrintPoint(p); public成员实现二续成员实现二续输出结果:输出结果:MyPoint:x=2,y=34.4 构造与接口构造与接口 显式接口成员实现显式接口成员实现 用接口成员的完全限定名接口名用接口成员的完全限定名接口名.成员名来显成

35、员名来显式指定要实现的接口成员,这样的实现声明称为式指定要实现的接口成员,这样的实现声明称为显式接口成员实现声明,简称显式实现声明显式接口成员实现声明,简称显式实现声明; 留意:显式实现声明中不能用留意:显式实现声明中不能用public修饰符。修饰符。4.4 构造与接口构造与接口interface IA void p();class B:IA void IA.p() /代码实现代码实现 class Test public static void Main() B b=new B(); b.p(); IA a=b; a.p(); 显式成员实现显式成员实现(一一)错误错误正确正确4.4 构造与接口

36、构造与接口interface IA void p(); interface IB void p(); class C:IA,IB void IA.p()Console.WriteLine(“A.p); void IB.p()Console.WriteLine(“B.p); public void p() Console.WriteLine(“C.p); class Test public static void Main() C c=new C(); c.p(); (IA)c).p(); (IB)c).p(); 显式成员实现显式成员实现(二二)输出结果:输出结果:C.pA.pB.p4.4 构造

37、与接口构造与接口interface IA void p(); class B:IA void IA.p()Console.WriteLine(“A.p); public void p() Console.WriteLine(“B.p); class C:B,IA public static void Main() B b=new B(); IA a=b; a.p(); /显式接口成员实现优显式接口成员实现优先先 C c=new C(); a=c; c.p(); a.p(); 显式成员实现显式成员实现(三三)输出结果:输出结果:A.pB.pA.p类可以同时有一个基类和零个以类可以同时有一个基类和

38、零个以上的接口,并将基类写在前面上的接口,并将基类写在前面4.6 异常处置异常处置 异常异常 指由于程序运转时发生的错误,从而导致程序错指由于程序运转时发生的错误,从而导致程序错误终了。误终了。 异常处置异常处置 当程序运转过程中发生了某个异常景象,系统当程序运转过程中发生了某个异常景象,系统将产生一个相应的异常类对象,并把它交给系统将产生一个相应的异常类对象,并把它交给系统处置,系统担任找四处置错误的代码并执行,处置,系统担任找四处置错误的代码并执行, 如如除数为除数为0。4.6 异常处置异常处置 运用语句或表达式在执行过程中自动引发了某个异常的条运用语句或表达式在执行过程中自动引发了某个异

39、常的条件件,使得操作无法正常终了使得操作无法正常终了,从而引发异常;从而引发异常; 运用显式运用显式 throw 语句来引发异常。在此情况下,控制权语句来引发异常。在此情况下,控制权将无条件转四处置异常的部分代码。将无条件转四处置异常的部分代码。引发异常两种方式引发异常两种方式C#中异常处置语句中异常处置语句 trycatch trycatchfinally tryfinally throw4.6 异常处置异常处置try 被监控的能够发生异常的程序代被监控的能够发生异常的程序代码码catch(异常类名异常类名 异常变量名异常变量名) 异常处置异常处置格式格式1 1try 被监控的能够发生异常的

40、程序代被监控的能够发生异常的程序代码码finally 最终要执行的代码最终要执行的代码格式格式2 2try 被监控的能够发生异常的程序代被监控的能够发生异常的程序代码码catch(异常类名异常类名 异常变量名异常变量名) 异常处置异常处置finally 最终要执行的代码最终要执行的代码格式格式3 34.6 异常处置异常处置 try子句包含能够引起异常的代码;子句包含能够引起异常的代码; 只需发生异常时才执行只需发生异常时才执行catch子句,假设没有异常,子句,假设没有异常,try子句子句正常终了,正常终了,catch子句被忽略,程序转到子句被忽略,程序转到catch后的第一条语后的第一条语句

41、开场执行;句开场执行; 可以包含多个可以包含多个catch语句;语句; catch子句可以不包括参数,它将捕获一切类型的异常;子句可以不包括参数,它将捕获一切类型的异常; 异常类名必需为异常类名必需为System.Exception或从或从System.Exception派生的类型;派生的类型; finally子句不论有没有异常都执行。子句不论有没有异常都执行。4.6 异常处置异常处置异常类名称异常类名称说明说明ArithmeticException错误:由于数学运算导致的异常FormatException参数的格式不正确ArgumentNullException参数为空:给方法传递一个不可接

42、受的空参数MemberAccessException访问错误:类型成员不能被访问数学计算ArrayTypeMismatchException数组类型不匹配DivideByZeroException被零除ArgumentException参数错误:方法的参数无效IndexOutOfRangeException索引超出范围InvalidCastException非法强制转换,在显式转换失败时引发MulticastNotSupportedException不支持的组播:组合两个非空委派时引发NotSupportedException调用的方法在类中没有实现NullReferenceException

43、引用空引用对象时引发OutOfMemoryException无法为新语句分配内存时引发,内存不足OverflowException溢出StackOverflowException栈溢出NotFiniteNumberException无限大的值:数字不合法4.6 异常处置异常处置int num1, num2,result;try num1 = int.Parse(Console.ReadLine(); num2 = int.Parse(Console.ReadLine(); result = num1 / num2; Console.WriteLine(“商是商是+result);catch(D

44、ivideByZeroException error) Console.WriteLine(除数不能为零!除数不能为零!); catch (FormatException error) Console.WriteLine(输入格式错误!输入格式错误!); catch(Exception ex) /假设写,写在假设写,写在catch的最后的最后 Console.WriteLine(“输入错误输入错误);finally Console.WriteLine(谢谢运用!谢谢运用!);异常处置异常处置4.6 异常处置异常处置throw异常处置异常处置static int Divide(int x,int

45、 y) try int z=x/y; return z; catch(DivideByZeroException error) throw new DivideByZeroException(“除除数不能为数不能为0); static void Main() int num1, num2,result; try num1 = int.Parse(Console.ReadLine(); num2 = int.Parse(Console.ReadLine(); result = Divide(num1,num2); Console.WriteLine(“商是商是+result);catch(Div

46、ideByZeroException error) Console.WriteLine(error.Message);catch (FormatException error) Console.WriteLine(输入格式错误!输入格式错误!);catch(Exception ex) Console.WriteLine(“输入错误输入错误);finally Console.WriteLine(谢谢运用!谢谢运用!); 4.7 委托委托 委托也叫代理,就是把事情交给他人去办,如委托律师代理委托也叫代理,就是把事情交给他人去办,如委托律师代理打官司,委托同窗代买火车票;打官司,委托同窗代买火车票;

47、 C#中假设将一个方法委托给一个代理对象,那么这个对象就中假设将一个方法委托给一个代理对象,那么这个对象就可以全权代理这个方法的执行;可以全权代理这个方法的执行; 运用委托首先要定义委托,声明委托能代理什么类型的方法运用委托首先要定义委托,声明委托能代理什么类型的方法,就像房产中介能代理抵押贷款业务,而不能代理打官司;,就像房产中介能代理抵押贷款业务,而不能代理打官司; 委托是一种类型委托是一种类型,即它与即它与class , interface , struct ,enum处处于同一级别于同一级别,而且它是援用类型;而且它是援用类型; 任何委托类型都是任何委托类型都是system.deleg

48、ate类的派生类。类的派生类。4.7 委托委托 何时运用委托?何时运用委托? 1回调函数;回调函数; 2多线程编程中运用委托来指定启动一个线程时调用的多线程编程中运用委托来指定启动一个线程时调用的方法;方法; 3C#中的事件模型。用它们指明处置给定事件的方法中的事件模型。用它们指明处置给定事件的方法。4.7 委托委托 委托用法步骤:委托用法步骤: 1定义委托定义委托 访问修饰符访问修饰符 delegate 代理方法的前往值类型代理方法的前往值类型 委托类型名委托类型名代理方法参数列表代理方法参数列表 2声明委托变量声明委托变量 委托类型名委托类型名 委托对象;委托对象; 3实例化委托变量实例化

49、委托变量 委托对象委托对象=new 委托类型对象名委托类型对象名.方法名方法名/调用某类的实例调用某类的实例方法方法 委托对象委托对象=new 委托类型类名委托类型类名.方法名方法名/调用某类的静态方调用某类的静态方法法 4调用委托,实现方法调用委托,实现方法 委托对象实参委托对象实参实例化时必需指定实例化时必需指定方法名方法名4.7 委托委托Void Multiply(int,int).Void Divide(int,int).可以援用任何方法,将在运转时决议委托和方法必需具有一样的签名-public delegate void Call(int num1, int num2);-4.7 委托委托定义委托定义委托namespace Delegates public delegate int Call(int num1, int num2); class Math public int Multiply(int num1, int num2) return num1*num2; public int Divide(int num1, int num2) return num1/num2; class TestDelegates publi

温馨提示

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

评论

0/150

提交评论