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的构造函数中加上一个金额来实例化对象。




运行之后:


小结:

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

 





目录
相关文章
|
3月前
|
C#
C#一分钟浅谈:委托与事件的实现方式
本文详细介绍了C#编程中委托与事件的基础知识及应用场景。首先解释了委托的概念,包括定义与使用方法;接着介绍了事件这一基于委托的特殊类型,展示了如何在类中定义事件及跨类订阅与处理事件;最后讨论了常见问题如事件未处理异常、重复订阅及内存泄漏等,并提出了相应的解决方案。通过本文,读者将全面掌握委托与事件的使用技巧,提升应用程序的设计与开发水平。
124 7
|
4月前
|
C#
由浅入深理解C#中的事件
由浅入深理解C#中的事件
110 19
|
4月前
|
编译器 C#
C#中内置的泛型委托Func与Action
C#中内置的泛型委托Func与Action
66 4
|
4月前
|
图形学 C# 开发者
全面掌握Unity游戏开发核心技术:C#脚本编程从入门到精通——详解生命周期方法、事件处理与面向对象设计,助你打造高效稳定的互动娱乐体验
【8月更文挑战第31天】Unity 是一款强大的游戏开发平台,支持多种编程语言,其中 C# 最为常用。本文介绍 C# 在 Unity 中的应用,涵盖脚本生命周期、常用函数、事件处理及面向对象编程等核心概念。通过具体示例,展示如何编写有效的 C# 脚本,包括 Start、Update 和 LateUpdate 等生命周期方法,以及碰撞检测和类继承等高级技巧,帮助开发者掌握 Unity 脚本编程基础,提升游戏开发效率。
84 0
|
4月前
|
C#
C#中的委托(一)
C#中的委托(一)
38 1
|
4月前
|
存储 算法 安全
C#语言进阶(二)—事件全解
C#语言进阶(二)—事件全解
38 0
|
4月前
|
C# C++
C#语言进阶(一)—委托
C#语言进阶(一)—委托
51 0
|
7月前
|
存储 安全 C#
C# - 委托与事件
这篇文档介绍了C#中的委托和事件。委托是存储方法引用的类型,支持回调、事件处理,具有引用方法、类型安全、多播性等特性,并在异步编程中发挥作用。事件是委托的封装,提供保护和订阅机制,防止外部直接访问。当需要在类内部控制方法调用,防止外部误触发时,可使用事件。
|
6月前
|
C#
C#||委托和事件的实例
C#||委托和事件的实例
|
7月前
|
C#
c#委托详解
c#委托详解
38 0