A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 赵威 中级黑马   /  2013-4-23 17:16  /  1184 人查看  /  3 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 赵威 于 2013-4-29 09:12 编辑

namespace 委托练习2
{
    class Program
    {
        static void Main(string[] args)
        {
            class1 c1 = new class1();
            c1.DoSth(M1 );
            Console.ReadKey();
        }
        static void M1()
        {
            Console.WriteLine(System .DateTime .Now .ToString ());
        }
        static void M2()
        {
            File.WriteAllText("abcd.txt", System.DateTime.Now.ToString(), Encoding.Default);
        }
    }
    public class class1
    {
        public void DoSth(MyDelegate md)//这个地方的委托变量,其实就相当于一个占位符一样,只不过占位符是用{0}来表示,而这里是用委托变量来占位,占的这个位置就是以后放置方法用的
        {
            Console.WriteLine("=============================");
            Console.WriteLine("=============================");
            Console.WriteLine("=============================");
            if (md != null)
            {
                md();
            }
            Console.WriteLine("=============================");
            Console.WriteLine("=============================");
            Console.WriteLine("=============================");
        }
    }
    public delegate void MyDelegate();
   
}

在复习委托的时候遇到这么个问题:就是上面的c1.DoSth(M1 );,感觉委托和多态有点像,二者的区别到底体现在什么地方?在用委托的时候需要注意什么?

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

3 个回复

倒序浏览
1. 委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的调用可以像其他任何方法一样,具有参数和返回值,
2. 对于非虚的成员来说,系统在编译时,根据传递的参数,返回的类型等信息决定实现何种操作。
回复 使用道具 举报
委托---是一种数据类型,用之前需要先定义。
public delegate....
委托和类一样,使用时也需要声明一个变量,然后new一个委托对象。
什么时候用委托?为什么要用委托?--当需要保存一个方法的时候使用委托,当要在程序中把方法本身作为参数传递时使用委托。
定义委托注意事项:1.委托的返回值类型,取决于将来要保存的方法是否有返回值类型。2.委托有没 参数也取决于将来要保存的方法是否有参数及参数的个数与类型。3.委托就像一个没有任何实现的方法一样,以“;”结尾。4.关键字delegate.

委托注意事项:
如果委托有返回值并且在调用列表中有一个以上的方法,则需要注意:1.调用列表中最后一个方法返回的值就是委托调用返回的值。2.调用列表中所有其他方法的返回值都会被忽略。3,如果委托有引用参数,参数值会根据调用列表中的一个或多个方法的返回值而改变。

你想多了,委托跟多态一点也不像。
回复 使用道具 举报
根据msdn上对委托的定义是:委托相当于C语言中的函数指针,当你定义一个委托后,可以给他赋上很多的函数。当调用一个委托时,委托中的函数会依次执行,这样就可以很方便的实现一次性调用多个函数,而不必每次想调用一个函数时再到前面去找。再说一下多态,在msdn上有其定义:通过继承,一个类可以用作多种类型:可以用作它自己的类型、任何基类型,或者在实现接口时用作任何接口类型,这称为多态性。我的理解:通过继承实现的不同对象调用相同的方法,表现出不同的行为,称之为多态,例如,表示汽车的基类可能包含这样的行为:当考虑的汽车为小型货车或敞篷汽车时,这些行为将会改变,。
理论不懂的话,看一下实例:
1.public delegate void Mydelegate(string name); //定义一个委托  
2.    class Program  
3.    {  
4.        public static void show(string name)  
5.        {  
6.            Console.WriteLine(name);  
7.        }  
8.        static void Main(string[] args)  
9.        {   
10.            Mydelegate My = show;//利用遇他相对应的方法来实例化委托   
11.          My("呵呵");//调用委托  
12.           Console.ReadKey();  
13.        }  
14.    }  
再来个多态的实例:


public class Animal
     {
         public virtual void Eat()
         {
             Console.WriteLine("Animal eat");
         }
     }

     public class Cat : Animal
     {
         public override void Eat()
         {
             Console.WriteLine("Cat eat");
         }
     }

     public class Dog : Animal
     {
         public override void Eat()
         {
             Console.WriteLine("Dog eat");
         }
     }

     class Tester
     {
         static void Main(string[] args)
         {
             Animal[] animals = new Animal[3];

             animals[0] = new Animal();
             animals[1] = new Cat();
             animals[2] = new Dog();

             for (int i = 0; i < 3; i++)
             {
                 animals[i].Eat();
             }
         }
     }





     输出如下:

Animal eat...

Cat eat...

Dog eat...
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马