本来c#这种语法会有容易让人歧义,读者问一想到,他有什么作用,我用别的方式完也是可以替代的了的
延续前面的文章,
//MyDelegate d = new MyDelegate(p.InstanceMethod);
//d(); //以委托为中介,进行转换,进而可以以把函数 作为函数的参数传递,有点拗口。
但是有另外一种方式来,实现同样的情况,暂时只能给出这样的一个类比,进而说明问题的本身。
函数回调,不过在回调之前要绑定,绑定就要用到event ,代码如下
代码
public delegate void MyDelegate(); // delegate declaration
public interface I
{
event MyDelegate MyEvent;
void FireAway();
}
public class MyClass : I
{
public event MyDelegate MyEvent;
public void FireAway()
{
if (MyEvent != null)
MyEvent();
}
}
public class MainClass
{
static private void f()
{
Console.WriteLine("This is called when the event fires.");
}
static public void Main()
{
I i = new MyClass();
i.MyEvent += new MyDelegate(f); //进行事件绑定
i.FireAway(); //调用类的方法 -----> MyEvent(); -->回调 f
}
}
public interface I
{
event MyDelegate MyEvent;
void FireAway();
}
public class MyClass : I
{
public event MyDelegate MyEvent;
public void FireAway()
{
if (MyEvent != null)
MyEvent();
}
}
public class MainClass
{
static private void f()
{
Console.WriteLine("This is called when the event fires.");
}
static public void Main()
{
I i = new MyClass();
i.MyEvent += new MyDelegate(f); //进行事件绑定
i.FireAway(); //调用类的方法 -----> MyEvent(); -->回调 f
}
}
我一直以为这个事件与委托没什么必要,其实这种的出现是在破坏面向对象,或许说的对,规则的建立,就是用于来破坏的
i.MyEvent += new MyDelegate(f); //进行事件绑定,把f的函数地址赋给已经实例化的的i ,这样i在此时拥有了函数 f的地址.
i.FireAway(); 此时用于调用实例化对象i的方法
在这个实例当中我看到在一个
实例化的对象中的方法 a
去调用
另外一个对象b中的方法 的时候 a并没有去实例化对象b,而是通过一种间接的方法,从而实现这样的一个功能,我们称之为方法的回调.
有不同意见的朋友,完全可以跟我来讨论.