开发者社区> soledad_lhc> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

C#:委托与事件

简介:          Mrs_Hudson想要出租她在Baker 211B的房子,于是她找到了中介公司;而Sherlock想要租一套房子,他也找了相同的中介公司,并且相中了Baker 211B的房子,于是他决定租下它。
+关注继续查看
   

     Mrs_Hudson想要出租她在Baker 211B的房子,于是她找到了中介公司;而Sherlock想要租一套房子,他也找了相同的中介公司,并且相中了Baker 211B的房子,于是他决定租下它。

    在这里,按照面向对象的观点,我们可以抽象出3个对象:the HouseOwner:Mrs_Hudson ;HouseRenter:Sherlock    and    the Agency.下面,我们来用面向对象的语言来分析下这个过程:



租房子

   那么,用面向对象的语言该如何描述这个租房过程呢?如下图:


首先,在房主和租房者之间有一个房产中介,用于传递房主和租房者之间的交流信息。(在图中,委托被画成了一个类的样子,为什么呢?因为你看一些书的时候,书上会说:委托是一个类。具体原因自己百度下吧~)其次,是房主和租房者。


先看房主HouseOwner的代码:

class HouseOwner
    {
        private string name;
        
        public HouseOwner(string name)
        {this.name=name;}

        public delegate void AgencyHandler();   //声明委托AgencyHandler,将来由该委托对象负责通知事件
        public event AgencyHandler HouseRent;  //声明事件HouseRent,它的事件类型是委托AgencyHandler

        public void Rent()
        {
            Console.WriteLine("{0}要出租房屋",name);
            if (HouseRent != null)   //如果执行Rent方法时,HouseRent中有对象登记事件,则执行HouseRent
            {
                HouseRent();

            }
        }

    }

然后是租房者:

class HouseRenter
    {
        private string name;

        public HouseRenter(string name)
        {
            this.name=name;
        }

        public void RentHouse()
        {
            Console.WriteLine("{0}要租房子。",name);
        }
    }

只要一有合适的房子,租房者就表示要租房子。

 

那么,房主的Rent事件和租房者的RentHouse事件如何绑定呢?

看主函数代码:

static void Main(string[] args)
        {
            HouseOwner Mrs_Hudson=new HouseOwner("Mrs_Hudson");
            HouseRenter Sherlock=new HouseRenter("Sherlock");

            Mrs_Hudson.HouseRent += new HouseOwner.AgencyHandler(Sherlock.RentHouse);

            Mrs_Hudson.Rent();

        }

其中, Mrs_Hudson.HouseRent += newHouseOwner.AgencyHandler(Sherlock.RentHouse);

将租房者的RentHouse事件,通过实例化委托登记到房东的HouseRent事件当中,当执行Mrs_Hudson.Rent();时,表示房东要出租房子,然后委托通知租房者,租房者表示要租房。


运行结果:





谈价钱

既然要租房子,当然房东和租房者要谈价钱了,这就涉及到了两个类中数据的交流。那么,如何通过委托来实现数据的交流呢?

 

在.NET框架中,还提供了事件参数基类EventArgs专门用于传递事件数据。

从该EventArgs类派生一个自定义的事件参数类MoneyEventArgs,这个类型将携带具体的房租金额。

此时,我们要增加一个MoneyEventArgs,这个类用于存放房子的租金信息:

class MoneyEventArgs : EventArgs
   {
       private string money;
       public string  Money
       {
           get { return this.money; }
           set { this.money = value; }
  
       } 

   }

而且,房东类中也要加一个字段,money,并且使用刚才定义的MoneyEventArgs,来传递房租价格这一数据。

 

如图:




租房者一端,也要做出相应改变:



这里,主要也是定义一个MoneyEventArgs,用来接收房东一端广播式的传送过来的房租金额这一数据。

 

入口函数变化很小,只是在HouseOwner的构造函数中加上一个金额来实例化对象。




运行之后:


小结:

在租房者和房东这两个类中,它们原本需要传递相互传递数据,来实现租房这一过程,但是现在通过委托这一第三方来实现租房这一过程,减少了两个类的直接接触,实现了低耦合。

 





版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
C#中的委托与事件
定义   委托是对函数的封装,可以当做给方法的特征制定一个名称。而事件则是委托的一种特殊形式,当发生有意义的事情时,事件对象处理通知过程。事件其实就是设计模式中观察者模式在.NET中的一种实现方式,现在还没接触,以后慢慢理解。
497 0
C#之委托和事件
        我想,读者们可能看过一部电影叫《全民目击》,在电影中,富豪林泰婚期将至,准新娘却惨死地下停车场,林泰的富二代女儿林萌萌成为最大嫌疑人,林泰不惜重金聘请国内顶级律师周莉为女儿辩护,而公诉方却是十多年一直追查林泰的童涛。
797 0
[C#]委托和事件(详细讲解)
引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。它们就像是一道槛儿,过了这个槛的人,觉得真是太容易了,而没有过去的人每次见到委托和事件就觉得心里别(biè)得慌,混身不自在。
531 0
【转】C# 中的委托和事件
转载自:http://www.cnblogs.com/JimmyZhang/archive/2007/09/23/903360.html 源码下载:http://www.tracefact.net/SourceCode/Delegates-and-Events-in-CSharp.rar 引言 委托 和 事件在 .Net Framework中的应用非常广泛,然而,较好地理解委托和事件对很多接触C#时间不长的人来说并不容易。
459 0
c#之委托和事件
一:委托简介委托是一种指针,保持方法的引用委托使得方法可以作为参数进行传递如: public delegate void MyDelegate(); class Program { private static void SayHellow() { Console.
820 0
C#中的委托和事件(续)
C#中的委托和事件(续) 引言 如果你看过了 C#中的委托和事件 一文,我想你对委托和事件已经有了一个基本的认识。但那些远不是委托和事件的全部内容,还有很多的地方没有涉及。本文将讨论委托和事件一些更为细节的问题,包括一些大家常问到的问题,以及事件访问器、异常处理、超时处理和异步方法调用等内容。
425 0
C# 中的委托和事件
C# 中的委托和事件 文中代码在VS2005下通过,由于VS2003(.Net Framework 1.1)不支持隐式的委托变量,所以如果在一个接受委托类型的位置直接赋予方法名,在VS2003下会报错,解决办法是显式的创建一个委托类型的实例(委托变量)。
632 0
+关注
soledad_lhc
csdn博客:http://blog.csdn.net/lhc1105
文章
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载