zoukankan      html  css  js  c++  java
  • 白话说.net事件和委托

    在学习C#中时候很早就听到过委托这个概念,我读了许多文章都没能理解它的含义,园子里好多是这么解释的:“委托相当与c++函数指针...”
    本人没有学过C++,只模糊的记得在学C语言基础的时候,对指针的理解是这样的,指针是一个本身不存放值的变量,它里面存放的是另一个变量的内存地址。所以使我联想到了值类型变量和引用类型变量。
    更是糊里糊涂的,在后来的工作学习中,渐渐的理解了它的含义。

    问题:
    1,委托到底是个什么东东。
    2,什么时候能用到委托。

    声明:这里,我们不去探讨委托的原理,内部机制等等...只是想把我对委托的理解,说出来...内容也仅供参考,欢迎改为前辈拍砖。
    下面用白话和一个很白的例子说明问题。

    定义一个类,里面有属性,方法,有的方法是通用的,我们可以实现它的代码。有的方法需要在具体的调用时才能确定它应该完成的功能,所以这里定义一个委托,具体的执行代码在调用时候再实现。这样就能根据实现代码的不同完成不同的操作。觉得是多态的一种表示形式。


    还不明白,那看下面这个很“白”的例子:
    我们的需求是这样的
    某饭店 老板让 购物员去买菜,要买白菜和土豆,最后算出总价格
    老板说:“白菜的价格如果大于3.5元,就扣除白菜的杂质,扣除方法是 每1公斤减掉0.3公斤的杂质再买”
    购物员:“那土豆也是用这个规则么?”
    老板说:“土豆按什么规则,扣不扣杂质你自己决定”
    购物员暗想:“先去菜市场看看价格如果土豆的价格大于2.5元就扣杂质。。。”
    这里姑且 买菜怎么买法有买方决定

    下面实现我们的代码

     //买菜类
     public class BuyVegetable
        {
            double CabbageMoney;
            double MurphyMoney;

    Code


             因为只知道要买土豆,具体怎么买现在决定不了,所以只能 定一个 事件。
     白话:怎么买得到到了菜市场才能决定,可是无论怎么样都得有买土豆这回事儿,无论到了菜市场怎么决定都离不开“价格”和“数量”这两个条件,这里就用到委托了,所以这个事件是委托类型的。 delegateBuyMurphy(委托的定义在下面)

            /// <summary>
            
    /// 购买土豆事件
             
    /// </summary>
            public event delegateBuyMurphy eventBuyMurphy;

     所以购买土豆的方法是这样的

    Code

    计算总金额

            /// <summary>
            
    /// 统计总体价格
             
    /// </summary>
            
    /// <returns></returns>
            public double Stat()
            {
                
    return CabbageMoney + MurphyMoney;
            }


        }
    购买土豆委托

    Code


    使用上面的买菜类开始购买

            protected void Page_Load(object sender, EventArgs e)
            {

                //实例化类不用说了吧
                BuyVegetable buyVegetable = new BuyVegetable();


                //购买白菜,老板制定的死规则不能改直接用这个规则吧。

                buyVegetable.BuyCabbage(3.68);

                //采购员问:土豆多少钱斤啊。
                //售货员说:4.8。
                //采购员说:等会,我先算算怎么买法
                //购物员开始制定定买土豆的规则buyVegetable_eventBuyMurphy(代码在下面)

                //制定完了,这个规则是买土豆这事儿的,当然得给买土豆这事儿

                buyVegetable.eventBuyMurphy += new delegateBuyMurphy(buyVegetable_eventBuyMurphy);


                //购买土豆

                buyVegetable.BuyMurphy(4.89);


                //计算总价格

                this.Response.Write(buyVegetable.Stat());


            }
            //购买土豆的规则方法buyVegetable_eventBuyMurphy      

    Code
  • 相关阅读:
    标签的讲解
    属性分类
    LeetCode 003. 无重复字符的最长子串 双指针
    Leetcode 136. 只出现一次的数字 异或性质
    Leetcode 231. 2的幂 数学
    LeetCode 21. 合并两个有序链表
    象棋博弈资源
    acwing 343. 排序 topsort floyd 传播闭包
    Leetcode 945 使数组唯一的最小增量 贪心
    Leetcode 785 判断二分图 BFS 二分染色
  • 原文地址:https://www.cnblogs.com/ejiyuan/p/1453120.html
Copyright © 2011-2022 走看看