Loading

委托-zhangziyang

//定义委托,代表方法的类型
    public delegate void GreetingDeleagte(string name);
    public delegate void GreetingDeleagte1(string name);
    public partial class weituo : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {
            string name1, name2;
            name1 = "张sdf";
            name2 = "zhangdf";
/*写法一
            委托GreetingDelegate 和 类型 string 的地位一样,都是定义了一种参数类型,也可以这么使用委托 */
            GreetingDeleagte deleagte1, deleagte2;
            deleagte1 = EnglishGreeting;
            deleagte2 = ChineseGreeting;

            GreetPeople(name1, deleagte1);
            GreetPeople(name2, deleagte2);

/*写法二
            1.委托不同于string的一个特性:可以将多个方法赋给同一个委托,或者叫将多个方法绑定到同一个委托,
              当调用这个委托的时候,将依次调用其所绑定的方法 
              
            2.注意这里,第一次用的“=”,是赋值的语法;
              第二次,用的是“+=”,是绑定的语法。如果第一次就使用“+=”,将出现“使用了未赋值的局部变量”的编译错误
             */
            GreetingDeleagte delegates;
            delegates = EnglishGreeting; // 先给委托类型的变量赋值
            delegates += ChineseGreeting; // 给此委托变量再绑定一个方法

            // 将先后调用 EnglishGreeting 与 ChineseGreeting 方法
            GreetPeople("Jimmy Zhang", delegates);


            /* 上面的写法是否能用下面的写法代替,答案是否定的!
               
               GreetingDelegate delegate1 = new GreetingDelegate();
               delegate1 += EnglishGreeting; // 这次用的是“+=”,绑定语法。
               delegate1 += ChineseGreeting; // 给此委托变量再绑定一个方法
               
               但实际上,这样会出现编译错误: “GreetingDelegate”方法没有采用“0”个参数的重载。
               尽管这样的结果让我们觉得有点沮丧,但是编译的提示:“没有0个参数的重载”再次让我们联想到了类的构造函数。
               我知道你一定按捺不住想探个究竟,但再此之前,我们需要先把基础知识和应用介绍完。
             */


/*写法三    */

            GreetingDeleagte delegate3 = new GreetingDeleagte(EnglishGreeting);// 相当于 先给委托类型的变量赋值
            delegate3 += ChineseGreeting; // 给此委托变量再绑定一个方法 

            // 将先后调用 EnglishGreeting 与 ChineseGreeting 方法
            GreetPeople("Jimmy Zhang", delegate3); 
            Console.WriteLine();
            delegate3 -= EnglishGreeting; //取消对EnglishGreeting方法的绑定 

            // 将仅调用 ChineseGreeting 
            GreetPeople("张子阳", delegate3);

            /*总结:
            1: 委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,
               这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
             
            2.使用委托可以将多个方法绑定到同一个委托变量,当调用此变量时(这里用“调用”这个词,
              是因为此变量代表一个方法),可以依次调用所有绑定的方法
             
            3.委托GreetingDelegate出现的位置与 string相同,string是一个类型,那么GreetingDelegate应该也是一个类型,或者叫类(Class)。
              但是委托的声明方式和类却完全不同,这是怎么一回事?
              实际上,委托在编译的时候确实会编译成类。因为Delegate是一个类,所以在任何可以声明类的地方都可以声明委托。
             */
        }

        //它接受一个 GreetingDeleagte 类型的 *方法*  作为参数
        public void GreetPeople(string name,GreetingDeleagte MakeGreeting)
        {
            MakeGreeting(name);
        }

        public void EnglishGreeting(string name)
        {
            Response.Write("Morning:"+name);
        }

        public void ChineseGreeting(string name)
        {
            Response.Write("你好:"+name);
        }
    }
}


/*  缺点:
 * 
 * 尽管这样解决了问题,但我不说大家也很容易想到,这个解决方案的可扩展性很差,
 * 如果日后我们需要再添加韩文版、日文版,就不得不反复修改枚举和GreetPeople()方法,以适应新的需求。
    
        //定义枚举判断类型
        public enum Language { 
            Engilsh,Chinese
        }

        public void GreetPeople(string name,Language lang)
        {
            switch (lang)
            { 
                case Language.Engilsh:
                    EnglishGreeting(name);
                    break;
                case Language.Chinese:
                    ChineseGreeting(name);
                    break;
            }
        }

        public void EnglishGreeting(string name)
        {
            Response.Write("Morning:"+name);
        }

        public void ChineseGreeting(string name)
        {
            Response.Write("你好:"+name);
        }
 
 
 */

 

posted @ 2012-06-19 17:34  The Mechanic  阅读(224)  评论(0)    收藏  举报