黑马程序员技术交流社区
标题:
关于委托的一个疑问,求解答
[打印本页]
作者:
赵威
时间:
2013-4-23 17:16
标题:
关于委托的一个疑问,求解答
本帖最后由 赵威 于 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 );
,感觉委托和多态有点像,二者的区别到底体现在什么地方?在用委托的时候需要注意什么?
作者:
许庭洲
时间:
2013-4-23 21:44
1. 委托是一种引用方法的类型。一旦为委托分配了方法,委托将与该方法具有完全相同的行为。委托方法的调用可以像其他任何方法一样,具有参数和返回值,
2. 对于非虚的成员来说,系统在编译时,根据传递的参数,返回的类型等信息决定实现何种操作。
作者:
杜磊
时间:
2013-4-24 20:26
委托---是一种数据类型,用之前需要先定义。
public delegate....
委托和类一样,使用时也需要声明一个变量,然后new一个委托对象。
什么时候用委托?为什么要用委托?--当需要保存一个方法的时候使用委托,当要在程序中把方法本身作为参数传递时使用委托。
定义委托注意事项:1.委托的返回值类型,取决于将来要保存的方法是否有返回值类型。2.委托有没 参数也取决于将来要保存的方法是否有参数及参数的个数与类型。3.委托就像一个没有任何实现的方法一样,以“;”结尾。4.关键字delegate.
委托注意事项:
如果委托有返回值并且在调用列表中有一个以上的方法,则需要注意:1.调用列表中最后一个方法返回的值就是委托调用返回的值。2.调用列表中所有其他方法的返回值都会被忽略。3,如果委托有引用参数,参数值会根据调用列表中的一个或多个方法的返回值而改变。
你想多了,委托跟多态一点也不像。
作者:
mdl
时间:
2013-4-24 21:31
根据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...
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2