人生如心跳信号,有波峰有波谷,也许平静了时,就挂了,最近应该是遇到人生波谷了,亲人、亲属及周边的人一个接一个不在了,这周姑娘莫名其妙的骨折了,手机摔坏了,工作中遇到不信任了。。。。我只能总结下最近的心得,聊以自慰了。
一直以来,都知道C#是面向对象的语言,一切皆对象,但用的时候又不太会用,比如创建了类对象,也知道类中封装一些属性,方法。但真正由多个类实现一些功能时,心里就有点虚了,后来发现才是不知道类与类如何通讯,造成不敢使用类,向在一个类中全部完成。
经过这段的学习,总结发现有如下方式可以实现类与类之间的通讯。
1、当类与类需要实时通讯时,可以采用委托和事件的方式。啰嗦两句,以前见了委托和事件也是一脸懵逼,这次也搞通了。委托一边建立在你想向外传输数据的类中,先以delegate关键字定义个委托,例如pulice delegate void Fun(int[] x) ,接下来给委托实例化FunA funA,但并不赋实例方法,该类还有一个方法FunB,该方法主要产生5个数,然后在窗体上显示出来,但在窗体上显示,最好在Form类中写,这个时候就可以通过委托实例传输给Form类了。也可以理解为,将这个数据传递给委托实例,具体干什么,这块不需要管了。
public ClassA()
{
}
public delegate void FunA(int[] x);//定义一个委托
public FunA funA;//定义一个实例
public void FunB()
{
int[] data = new int[5];
for (int i = 0; i < 5; i++)//生成5个数
{
data[i] = i;
}
funA(data);//传递个委托实例,具体做什么不管了
}
2、这个时候在Form类中需要写一个显示这个数组的方法
private void show(int[] a)
{
string str = "";
for (int i=0;i<a.Length;i++)
{
str += a[i].ToString() + "-";
}
label1.Text = str;
}
3、在Form类中对委托实例添加方法,这时真正理解委托的含义,可以将方法作为参数传递。
public Form1()
{
InitializeComponent();
cA = new ClassA();
cA.funA = new ClassA.FunA(show); //对委托实例添加方法
}
4.调用classA的FunB方法,界面显示出生成的数据
private void button1_Click(object sender, EventArgs e)
{
cA.FunB();
}

可以看出,两个不同类通过委托,实现了数据的通讯,方法的调用,非常方便。这样的调用适用于在一个类中产生中间结果,下一步需要交给另外的类处理的情况。
接下来简绍本人对委托的另一种理解。
还是刚才的例子,在Form类中,我想对一个数组中每个元素×10,但是该类中没有这样的方法,而ClassA类中正好有这样的方法。

这样就可以在Form类中通过委托调用该方法

当然了,你也可以直接调用ClassA的FunC方法,这样不是多此一举吗?这可能就是委托的好处,如果你此时不想用FunC方法了,你重新绑定一个具有相同参数和返回值的方法是不是更方便呢。
其实这也就是下一个问题事件的调用,其实事件就是一种委托,当然事件相对于委托还是有些不一样,大家可以查资料。这里所说的事件是委托的一种是,在定义委托前加一个event就成了事件。

在Form类中对事件添加方法

这样当产生了数组后,分别执行了相应的动作。
另外一个类与类通讯的方式为创建类的静态实例,这样类中产生的结果不会消失。以前一直觉的每次使用类,一实例化,中间的数据就消失了,该怎么办呢,其实可以用下面的方法。创建了一个ClassB的静态实例对象_ClassB,该类有一个方法,为对两个数相加后,再加到sum上,想象的情况是每次调用Add方法,让数不停的相加。用这个静态实例类对象可以实现,如果用常规的创建一个类则不行。


以上为本人的理解,一些概念的说法也许不太对,也希望高手指出,本人将不胜感激。
731

被折叠的 条评论
为什么被折叠?



