从委托而起(二)认识委托

新建一个控制台应用程序,这个程序的作用是为一个字符串改变样子,所以起个名字叫Costumeball.嘉宾(字符串)通过一个个化妆间(函数)变得漂漂亮亮或奇奇怪怪后一起唱歌跳舞.好享受.

声明一个委托,委托一般出现在类之外,本例随便

delegate void Prink(string str);

创建与委托管理的方法,他们的签名必须一致

 static void Upper(string str) 

 {

     Console.WriteLine(str.ToUpper());

 }

 static void Lower(string str) 

 {

     Console.WriteLine(str.ToLower());

 }

 static void Mark(string str)

 {

     Console.WriteLine("\""+str+"\"");

 }

声明委托类型变量delegate void Prink(string str);,

Main方法代码如下:

static void Main(string[] args)

{

     string str="FaTSo";

     //进行委绑定

     prink = new Prink(Upper);

//回调方法

     prink(str);

     Console.ReadKey();

}

上述示例,在类内部声明了一个Prink委托类型.他具有和关联方法一样的签名(参数,返回值),否则会编译错误.将方法Upper传给了Prink构造函数,也就是将方法Upper指派给了Prink委托,并将其引用赋值给了prink变量,prink变量保存了Upper方法的指针,实现对Upper的回调.

再一个,在Main函数中添加下面代码:

 prink = new Prink(Mark);

 prink(str);

F5运行能看到prink(Mark)也得到了执行.先不管他怎么回事现在一起回忆下接口.写一个最简单接口的例子

    interface IInterface

    {

        void SayHi();

    }

    class Student:IInterface

    {

        public void SayHi()

        {

            Console.WriteLine("我是学生");

        }

    }

    class Teacher:IInterface

    {

        public void SayHi()

        {

            Console.WriteLine("我是老师");

        }

}

Main函数写上执行代码:

       IInterface p1; 

            p1 new Student();

            p1.SayHi();

            p1 = new Teacher();

            p1.SayHi();

分别输出,我是学生,我是老师.

   prink = new Prink(Upper);

            prink(str);

            prink = new Prink(Mark);

            prink(str);

            p1 = new Student();

            p1.SayHi();

            p1 = new Teacher();

            p1.SayHi();

很像,有木有,有木有.

委托将方法当作参数进行传递,并根据传入的方法来动态的改变方法调用。只要为委托提供相同签名的方法,就可以与委托绑定.

而接口约束了实现接口的类所存在的方法,根据实例化类型找到该方法,接口保障了子类必须实现接口方法.

都可以实现统一方法的调用.委托是参数类型不同,接口类是实例化对象不同.简单的说,委托就是 一个方法容器,你能往里面放很多方法,然后统一调用,一个委托代表一个真实的方法

多播委托,你让我干嘛,好我马上去做,你让我干嘛,好我马上去做.......

+=和-=操作符分别进行绑定和解除绑定的操作,

public static void Main()

{

string str = "FaTSo";

prink += new Prink(Upper);

prink += new Prink(Mark);

prink += new Prink(Lower);

prink -new Prink(Upper);

prink(str);

}

执行后依次输出 "FaTSo" fatso,事实上+=和-=操作分别调用了Deleagate.Combine和Deleagate.Remove方法,多播委托返回值一般都是void,委托类型非void时,多播委托将返回最后一个调用方法的执行结果.

委托的补充,回调方法真正的调用者是Invoke.可以在代码中显示调用

prink.Invoke(str);

posted @ 2011-08-18 13:00  刘凯威  阅读(268)  评论(0编辑  收藏  举报