C#:委托与事件

   

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

运行之后:

小结:

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

 

时间: 2024-08-02 20:47:11

C#:委托与事件的相关文章

从反射看委托与事件 委托真的是一个类

关于委托与事件,网上介绍得非常之多,在此不再赘述,本人最近需要捣鼓一些委托,因而对委托进行一 定的寻根究底,故用反射把委托的成员揪出来,且看如下代码: delegate void DelegateDemo(); static event DelegateDemo delHandle; static void Main() { delHandle += new DelegateDemo(MyDelegate_delHandle); MemberInfo[] mis = delHandle.GetT

C#委托和事件

委托和事件 .NET Framework 还可以广泛地将委托用于事件处理任务,如 Windows 或 Web 应用程序中的按钮 Click 事件.Java 中的事件处理通常通过实现自定义侦听器类完成,而 C# 开发人员则可以利用委托处理事件.事件的声明类似于具有委托类型的字段,区别在于事件声明前面有 event 关键字.事件通常被声明为 public,但允许使用任何可访问性修饰符.下面的示例演示了 delegate 和 event 的声明. C#  =复制代码 // Declare the de

你可能不知道的陷阱:C#委托和事件的困惑

一. 问题引入          通常,一个C语言学习者登堂入室的标志就是学会使用了指针,而成为高手的标志又是"玩转指针".指针是如此奇妙,通过一个地址,可以指向一个数,结构体,对象,甚至函数.最后的一种函数,我们称之为"函数指针"(和"指针函数"可不一样!)就像如下的代码: int func(int x); /* 声明一个函数 */ int (*f) (int x); /* 声明一个函数指针 */ f=func; /* 将func函数的首地址赋

C#中委托,事件理解入门

目录 l        导论 l        什么是委托 l        事件的理解 l        事件 关键字 l        最后     导论     在学习C#中的委托和事件过程中,我读了许多文章来理解他们二者究竟是怎么一回事,以及如何使用他们,现在我将整个的理解过程陈述以下,我学到的每一方面,恐怕也是你们需要掌握的 :-). 什么是委托?     委托和事件这两个概念是完全配合的.委托仅仅是函数指针,那就是说,它能够引用函数,通过传递地址的机制完成.委托是一个类,当你对它实例

C#编程利器之四:委托与事件(Delegate and event) (上)

本文试图在.net Framework环境下,使用C#语言来描述委托.事件的概貌.希望本文能有助于大家理 解委托.事件的概念,理解委托.事件的用途,理解它的C#实现方法,理解委托与事件为我们带来的好处 .C#是一种新的语言,希望大家能通过本文清楚地看到这些,从而可以对委托.事件等技术进行更深入的 理解和探索. 一. 委托 委托的本质 --在C#中,委托是一个特殊的类: --在某种程度上,相当于C++的函数指针: --在某种程度上,相当于接口(Interface): 委托的定义 --关键字:del

C#3.0笔记(二)预备知识之委托与事件

在上篇blog中简单地介绍了委托的基础知识,在这片文章中会介绍下委托跟 事件之间的联系. 事件的由来 我们可以看到在使用委托进行回调 的实现的时候,我们往往需要再定义一个委托对象,以及一个对外公开的辅助方 法来添加委托的方法,这样子会使我们感觉比较繁琐.C#提供了event关键字来 减轻直接使用委托的负担,编译器会自动提供注册.取消注册的方法和委托必要 的成员.首先来看看定义事件的步骤: 1.先定义委托类型: 2.通 过event关键字定委托类型的事件. public delegate int

C#----委托和事件(一)

什么是委托 委托怎么用 定义委托类型 声明委托对象 创建委托对象确定与哪些方法进行绑定 使用委托调用方法 使用委托注意事项 为什么用委托 总结      最近在做的项目,正在进行重构,之前的框架就是纯三层的简单调用,外加一些Session,SQLHelper等封装管理类,其他的东西,一直也想去抽象,但是奈何能力还有所欠缺,抽象出来的东西,被组长狠狠的给鄙视了一番,最近在组长的带领下,重新搭建框架,整个过程下来,真的是被狠狠的打击了,也真是服了我们组长了,太牛了,看来自己欠缺的还是很多很多.具体的

编写高质量代码改善C#程序的157个建议[C#闭包的陷阱、委托、事件、事件模型]

原文:编写高质量代码改善C#程序的157个建议[C#闭包的陷阱.委托.事件.事件模型] 前言 本文已更新至http://www.cnblogs.com/aehyok/p/3624579.html .本文主要学习记录以下内容: 建议38.小心闭包中的陷阱 建议39.了解委托的实质 建议40.使用event关键字对委托施加保护 建议41.实现标准的事件模型 建议38.小心闭包中的陷阱 首先我们先来看一段代码: class Program { static void Main(string[] arg

从使用层面上了解委托和事件的区别

从本篇文章中,我们将从代码层面知道委托和事件的差异和用处,并且我们不会用猫和老鼠之类奇怪的比喻来混淆大家. 首先,我们知道委托和事件都可以用来调用跟自己方法签名一样的方法.容易混淆大家的地方大多在于这两者之间的区别.从我们使用委托delegate和事件event上的主要有两大区别(如表1所示).                           表1 委托和事件的区别 序号 区别 委托 事件 1 是否可以使用=来赋值 是 否 2 是否可以在类外部进行调用 是 否 3 是否是一个类型 是 否,事

c#-C# 委托与事件 有点小问题

问题描述 C# 委托与事件 有点小问题 class Class1 { static void ChineseGreeting(string name) { Console.WriteLine("早上好,",name); } static void EnglishGreeting(string name) { Console.WriteLine("Good morning,",name); } static void Main(string[] args) { Gre