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

            /// <summary>
            /// 买白菜
             /// </summary>
            /// <param name="price"></param>
            /// <param name="amount"></param>
            /// <returns></returns>
            public void BuyCabbage(double price, double amount)
            {
                //这里老板制定的买白菜的方案
                //如果买白菜的价格小于3,就不去杂,如果大于3去去杂
                if (price < 3)
                {
                    CabbageMoney = price * amount;
                }
                else
                {
                    CabbageMoney = (price - 0.3) * amount;
                }
            }

       因为只知道要买土豆,具体怎么买现在决定不了,所以只能 定一个 事件。

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

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

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

      Code

            /// <summary>
            /// 买土豆
             /// </summary>
            /// <param name="price"></param>
            /// <param name="amount"></param>
            public void BuyMurphy(double price, double amount)
            {
                //这里只知道购买土豆,但是具体用怎么的规则购买,在购买的时候才能决定
                MurphyMoney = eventBuyMurphy.Invoke(price, amount);
            }

      计算总金额

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

        }

      购买土豆委托

        /// <summary>
        /// 购买土豆委托
        /// </summary>
        /// <param name="price"></param>
        /// <param name="x"></param>
        /// <returns></returns>
        public delegate double delegateBuyMurphy(double price, double x);

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

            protected void Page_Load(object sender, EventArgs e)
            {


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

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


                buyVegetable.BuyCabbage(3.6, 8);
     

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

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


                buyVegetable.eventBuyMurphy += new delegateBuyMurphy(buyVegetable_eventBuyMurphy);

                //购买土豆


                buyVegetable.BuyMurphy(4.8, 9);

                //计算总价格


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

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

      Code

            /// <summary>
            /// 购买土豆规则
             /// </summary>
            /// <param name="price"></param>
            /// <param name="x"></param>
            /// <returns></returns>
            double buyVegetable_eventBuyMurphy(double price, double x)
            {
                if (price > 2.5)
                {
                    return (price - 0.3) * x;
                }
                else
                {
                    return price * x;
                }
            }

    示例下载:https://files.cnblogs.com/mili3/Sol.rar

  • 相关阅读:
    【mybatis】IF判断的坑
    QCheckBox控件
    对话框——文件对话框
    对话框——颜色对话框
    对话框——输入对话框
    事件和信号
    布局管理——复习示例
    布局管理——网格布局
    布局管理——盒式布局
    1.4 控制流
  • 原文地址:https://www.cnblogs.com/mili3/p/2936271.html
Copyright © 2011-2022 走看看