OOP基础-属性和委托事件_第1页
OOP基础-属性和委托事件_第2页
OOP基础-属性和委托事件_第3页
OOP基础-属性和委托事件_第4页
OOP基础-属性和委托事件_第5页
已阅读5页,还剩27页未读 继续免费阅读

下载本文档

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

文档简介

1、1 属性5.5.1 属性属性2在类中属性采用如下方式进行声明:在类中属性采用如下方式进行声明:修饰符修饰符属性的类型名属性名属性的类型名属性名get /读访问器读访问器/可执行语句可执行语句 set /写访问器写访问器/可执行语句可执行语句属性修饰符有属性修饰符有new、public、protected、internal、private、static、virtual、override和和abstract共共9种。种。其中读、写属性的过程分别用其中读、写属性的过程分别用get访问器和访问器和set访问器来表示。访问器来表示。若若只包含只包含get,此为只读属性;只包含,此为只读属性;只包含set

2、,则为只写属性。,则为只写属性。 属性声明3【例【例5-21】字段和属性示例。using System; public class Student private int nAge;/私有域私有域 public int Age/属性,用户控制对域的访问属性,用户控制对域的访问 get return this.nAge; set if (value != this.nAge & value 0) this.nAge = value; 示例关键字关键字value接收接收用户给用户给Age属性所属性所赋的值赋的值4 static void Main(string args) Student

3、s = new Student(); s.Age = 20; / 20传值给传值给value,执行,执行Age属性的属性的set访问器访问器 Console.WriteLine(s.Age); /执行执行Age属性的属性的get访问器,得到返回值访问器,得到返回值 示例5学生类定义了一个学生类定义了一个私有字段私有字段nAge,也定义了,也定义了公有属公有属性性Age,并包含,并包含get和和set两个访问器,使其既可读也两个访问器,使其既可读也可写。可写。在属性的在属性的get访问器中,用访问器中,用return来返回一个事物的来返回一个事物的属性值。属性值。在属性的在属性的set访问器中可

4、以使用一个特殊的访问器中可以使用一个特殊的隐含参数隐含参数value。该参数包含用户指定的值,通常用在。该参数包含用户指定的值,通常用在set访问访问器中,将用户指定的值赋值到一个类变量中。器中,将用户指定的值赋值到一个类变量中。如果没有如果没有set访问器,则表示属性是只读的;如果没访问器,则表示属性是只读的;如果没有有get访问器则表示属性是只写的。访问器则表示属性是只写的。 示例说明6 5.6 委托和事件q 委托,顾名思义,就是中间代理人的意思。q 通俗地说,委托是一个可以引用方法的对象,当创建一个委托,也就创建一个引用方法的对象,进而就可以调用那个方法,即委托可以调用它所指向的方法。q

5、 事件是建立在委托基础上的另一个重要特性。从本质上说,事件就是当某个事情发生时,会自动去执行一些语句。事件是特殊化的委托,委托是事件的基础。7委托int Multiply(int,int).int Divide(int,int).在运行时确定调用哪种方法委托和方法必须具有相同的参数-public delegate int Call(int num1, int num2);-8定义委托的关键语法定义委托类型:委委托名托名 委托实例名委托实例名; 委托实例名声明委托对象:创建委托对象:(确定与哪些方法进行绑定)9委托 示例1using System;/ 委托定义class Math/ 乘法方法pu

6、blic int Multiply(int num1, int num2)return num1*num2;/ 除法方法public int Divide(int num1, int num2)return num1/num2;class Test static void Main(string args) / Math 类的对象Math objMath = new Math(); / 委托的对象/ 将方法与委托关联起来/ 调用委托实例result = System.Console.WriteLine(结果为 0, result); 将方法与委托关联起来10定义委托使用关键字delegate:

7、再实例化: 最后调用:相当于调用相当于调用objMath.Multiply(5,3);委托可以调用多个方法,称为多播,使用+和-运算实现方法的增加和减少。如,在上例基础上添加如下代码:Call d= new Call(objMath.Divide);objCall += d;objCall(5,3);则运行时,先调用则运行时,先调用objMath.Multiply(5,3); 再调用再调用objMath.Divide(5,3);理解多播11定义委托的步骤1 声明一个委托,其参数形式一定要和你想要包含的方法的参数形式声明一个委托,其参数形式一定要和你想要包含的方法的参数形式一致。一致。publi

8、c delegate void MyDelegate(参数);参数); 2 定义所有你要定义的方法,其参数形式和第一步中声明的委托对象定义所有你要定义的方法,其参数形式和第一步中声明的委托对象的参数形式必须相同。的参数形式必须相同。 Method(参数);(参数);【参数要一致】【参数要一致】3 创建委托对象并将所希望的方法包含在该委托对象中。创建委托对象并将所希望的方法包含在该委托对象中。 MyDelegate objMyDelegate = new MyDelegate(类类1.Method1);objMyDelegate += new MyDelegate(类类2.Method2);4

9、通过委托对象调用包含在其中的各个方法。通过委托对象调用包含在其中的各个方法。 objMyDelegate(待传入的参数待传入的参数);125.6.1 委托委托【例【例5-26】委托的使用。using System; namespace Example_Delegate delegate int MyDelegate();/第一步第一步:委托声明委托声明 delegate int NumOpe(int a, int b); /第一步第一步:委托声明委托声明 class MyClass public int M1() Console.WriteLine(调用的实例的方法调用的实例的方法); ret

10、urn 0; 135.6.1 委托委托 public static int M2() Console.WriteLine(调用的静态的方法调用的静态的方法); return 0; class clsAdd public int Add(int num1, int num2) return (num1 + num2); 145.6.1 委托委托 class Test static void Main() MyClass cls = new MyClass(); /委托实例化委托实例化,注意参数是要使用的方法名注意参数是要使用的方法名, /且不带括号且不带括号 MyDelegate d = new

11、 MyDelegate(cls.M1); d(); /委托调用委托调用 d = new MyDelegate(MyClass.M2); d(); /委托调用委托调用 clsAdd add = new clsAdd(); NumOpe p = new NumOpe(add.Add); Console.WriteLine(p(1, 2); /委托调用委托调用 Console.ReadLine(); 程序的运行结果如下:程序的运行结果如下:调用的实例的方法调用的实例的方法调用的静态的方法调用的静态的方法3155.6.2 事件事件事件就是当对象或类状态发生改变时,对象或类发出的信息事件就是当对象或类状

12、态发生改变时,对象或类发出的信息或通知。或通知。发出信息的对象或类称为发出信息的对象或类称为“事件源事件源”,对事件进行处理的方,对事件进行处理的方法称为法称为“接收者接收者”,通常事件源在发出状态改变信息时,它,通常事件源在发出状态改变信息时,它并不知道由哪个事件接收者来处理。并不知道由哪个事件接收者来处理。这就需要一种管理机制来协调事件源和接收者,在这就需要一种管理机制来协调事件源和接收者,在C#中事中事件使用委托来为触发时将调用的方法提供类型安全的封装。件使用委托来为触发时将调用的方法提供类型安全的封装。事件处理要用委托来表示。事件处理要用委托来表示。事件16理解事件 图示抢答者 宣布人

13、宣布人抢答者“请听题”集中注意力聆听其他人事件源事件的发布者事件的订阅人未订阅该事件 定义事件 为对象订阅该事件 将发生的事件通知给订阅人171. 事件的声明事件的声明事件是类成员,以关键字事件是类成员,以关键字event声明。声明。格式:格式:修饰符修饰符event 委托名委托名 事件名;事件名;事件实际就是一种特殊的委托对象。事件实际就是一种特殊的委托对象。例:例:delegate void MyEventHandler();事件的声明为:事件的声明为:class MyEventpublic event MyEventHandler active; /active就是一个事件名就是一个事件

14、名185.6.2 事件事件2. 事件的预订与取消事件的预订与取消事件的预订就是向委托的调用列表中添加方法,是事件的预订就是向委托的调用列表中添加方法,是通过事件加上运算符通过事件加上运算符+=来实现的。来实现的。格式:格式:事件名事件名 += new 委托名委托名(方法名方法名);例:例:MyEvent evt = new MyEvent(); evt.active += new MyEventHandler(handler);又例:又例:OkButton.Click += new EventHandler(OkButton.Click);这样,只要事件被触发,所预定的方法就会被调用。这样,只

15、要事件被触发,所预定的方法就会被调用。195.6.2 事件事件事件的撤销则采用左运算符事件的撤销则采用左运算符-=来实现。来实现。 事件名事件名 -= new 委托名委托名(方法名方法名);例:例:OkButton.Click-=new EventHandler(OkButton.Click);值得注意的是,在声明事件的类的外部,对于事件值得注意的是,在声明事件的类的外部,对于事件的操作只能用的操作只能用+=及及-=,而不能用其他任何的运算符,而不能用其他任何的运算符,如赋值如赋值“=”、判定是否为空、判定是否为空“=”等。但是声明事件等。但是声明事件的类型的上下文中(即在所在类的程序内部),

16、用这的类型的上下文中(即在所在类的程序内部),用这些运算符是可以的。些运算符是可以的。205.6.2 事件事件3. 事件的发生事件的发生事件的发生就是对事件相对应的委托的调用,也就事件的发生就是对事件相对应的委托的调用,也就是委托的调用列表中所包含的各个方法的调用。是委托的调用列表中所包含的各个方法的调用。格式:格式:事件名事件名(参数参数);215.6.2 事件事件【例【例5-28】演示事件的声明、事件的预订及撤销、事件的发生。using System; namespace Example_Event delegate void MyEventHandler();/为事件建立一个委托 cla

17、ss MyEvent public event MyEventHandler activate;/声明一个事件 public void fire() /调用此方法来触发事件 if (activate != null) activate();/事件发生 225.6.2 事件事件 class Test static void handler() Console.WriteLine(事件发生); static void Main() MyEvent evt = new MyEvent(); /把方法handler()添加到事件列表中 evt.activate += new MyEventHandle

18、r(handler); evt.fire(); /调用触发事件的方法 23 假设我们有个高档的热水器,我们给它通上电,当水温假设我们有个高档的热水器,我们给它通上电,当水温超过超过95度的时候:度的时候:1、扬声器会开始发出语音,告诉你水的、扬声器会开始发出语音,告诉你水的温度;温度;2、液晶屏也会改变水温的显示,来提示水已经快烧、液晶屏也会改变水温的显示,来提示水已经快烧开了开了 class Heater private int temperature; / 水温 / 烧水 public void BoilWater() for (int i = 0; i 95) MakeAlert(tem

19、perature); ShowMsg(temperature); 24 / 发出语音警报 private void MakeAlert(int param) Console.WriteLine(“Alarm:嘀,水已经 0 度了” , param); / 显示水温 private void ShowMsg(int param) Console.WriteLine(Display:水快开了,当前温度:0度。 , param); class Program static void Main() Heater ht = new Heater(); ht.BoilWater(); 25q现在假设热水器

20、由三部分组成:热水器、警报器、显示器,它们来自于不同厂商并进行了组装。那么,应该是热水器热水器仅仅负责烧水,它不能发出警报也不能显示水温;在水烧开时由警报器警报器发出警报、显示显示器器显示提示和水温。 26Observer设计模式中主要包括如下两类对象: Subject:监视对象,它往往包含着其他对象所感兴趣的内容。在本范例中,热水器就是一个监视对象,它包含的其他对象所感兴趣的内容,就是temprature字段,当这个字段的值快到100时,会不断把数据发给监视它的对象。 Observer:监视者,它监视Subject,当Subject中的某件事发生的时候,会告知Observer,而Observ

21、er则会采取相应的行动。在本范例中,Observer有警报器和显示器,它们采取的行动分别是发出警报和显示水温。27public class Heater private int temperature; public string type = “RealFire 001”; / 型号 public string area = “China Xian”; / 产地 /声明委托 public delegate void BoiledEventHandler(Object sender, BoiledEventArgs e); public event BoiledEventHandler Boi

22、led; /声明事件 / 定义BoiledEventArgs类,传递给Observer所感兴趣的信息 public class BoiledEventArgs : EventArgs public readonly int temperature; public BoiledEventArgs(int temperature) this.temperature = temperature; 28 protected virtual void OnBoiled(BoiledEventArgs e) if (Boiled != null) / 如果有对象注册 Boiled(this, e); / 调用所有注册对象的方法 / 烧水。 public void BoilWater() for (int i = 0; i 95) /建立BoiledEventArgs 对象。 BoiledEventArgs e = new BoiledEventArgs(temperature); OnBoiled(e); / 调用 OnBolied方法 29/ 警报器public class Alarm public void MakeAlert(Object sender, Heater.BoiledEventArgs e) Heater heater = (Heater)sende

温馨提示

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

评论

0/150

提交评论