待解决问题

【精华】.NET培练营"委托和事件"作业点评‏离问题结束时间还有261天2小时

学员:amandag(高歌 .NET学习顾问)提问时间:2008-09-25 01:18:41

周峰(afengwinner)
学员的作业描述:
照老师做的!还是不太理解委托和事件他俩个有什么关系
作业评语:好
教师点评:完成了第二个作业的全部功能。对你的问题略做回答,就这次的作业而言,我们的处理机制是看起来是我们点下了从窗体的按钮,主窗体的标签的文本发生了改变,但实际上我们是在从窗体的这个按钮点击事件中触发了自定义的事件,而这个自定义事件最后实际是交由主窗体的某个方法去处理的。在现实生活中这样的案例也比比皆是,比如你被人告上法庭(也就是你触发了被告事件),但处理这个事件的并不是你自己,而是你所委托的律师,但要注意,并不是人人都能当你的律师的,比如他必须要有律师资格证等等,换而言之也就是要满足你的条件,而这个条件就是事件处理程序(在你的例子中就是ShowCount函数)必须和委托声明时的返回类型及参数列表要一致(就是public delegate void MyClickDelegate())

cnitmtd
学员的作业描述:按老师的方法做了几次有出些问题. 不过看了.参考答案还是明白了. !
作业评语:好
教师点评:完成了全部功能。
关于第一个作业
public void run()
==
public void Run()
在C#中标准的命名规范是方法名首字母大写,尤其是公有的方法。
关于第二个作业稍微说一下
//在按钮单击事件中激发MyClick事件
private void btnClickMe_Click(object sender, EventArgs e)
{
if(MyClick!=null)
MyClick();
}
如果按照标准的事件处理机制,if(MyClick!=null)这个判断是必须要做的,因为它相当于在判断从窗体是否注册(订阅)了MyClick事件,也就是只有注册了事件的对象才会引发事件(说的直白点就是你不给律师给钱他能帮你打官司么?)。在我们的这个程序中不加这句话不会出错,因为我们的每一个从窗体都注册了此MyClick事件。如果不加这个判断,同学们再在主窗体中注释掉frm.MyClick +=...这句话,大家可以看看会出现什么问题。

liminjun88
作业评语:好

教师点评:完成了第一个作业的全部功能。在作业中用到了System.Threading.Timer类,算是另一种思路,不过未必满足金老师作业的本意.

livingbody
学员的作业描述:
该题主要是挂接事件:
frm.MyClick += this.ResponseToOtherFormMyClickEvent;
其他代理
作业评语:好
教师点评:完成了第二个作业的全部功能。请注意变量的命名规范(Form1,Form2,label2这些应该修改),还有请注意适当的注释

niunan
学员的作业描述:说实话这个委托和事件真的是N难理解,至少我是没有理解透,但是作业倒是能做出来,其实作业有95%是老师已经帮我做出来了,我只是改了一点点而已,我是根据老师的实例UseEventsInForm改的,只是在主窗体上加个按键,然后把构造函数里的建立子窗体那几句移到按钮点击事件里了,然后在从窗体那里把count设置为static,呵呵。。不知道这算不算作弊啊。。。
作业评语:好
教师点评:完成了第二个作业的全部功能。能对金老师的案例进行修改,这当然很好,不过就思想而言,金老师的处理方法更合理一些,就面向对象的思想而言,引发事件的代码和处理事件的代码更合理,这也是通常所说的高内聚,低耦合。

sun_quan
学员的作业描述:
使用2种方式实现.第2种实现了事件机制.
作业评语:好
教师点评:完成了第二个作业的全部功能。使用事件机制中出现的问题和上面niunan同学类似,请参考。

txwz2006
学员的作业描述:我花费了一些时间考虑如何是Count这个参数能够在第二个、第三个...窗体的实例化中不为0
作业评语:好
教师点评:完成了第二个作业的全部功能。请注意项目名称的命名规范(WindowsFormsApplication1),同样也请注意对cnitmtd同学第二个作业的点评。

隋亮亮(sllko2008)
作业评语:优秀

教师点评:完成了所有作业的全部功能。
对BookClass的建议:
可以考虑将name,author,bookconcern作为属性实现,而且请注意,C#中属性惯例应该是Pascal命名法,也就是单词的首字母应该大写,属性price改为Price更好。还有,没必要写自己的toString()方法,直接重写父类的ToString()方法更好(public override string ToString()
),这样将来输出的时候直接输出b1,b2对象即可,没有必要再显式调用toString()方法。
其他作业的点评请参考上面

回答

回答人:amandag(高歌 .NET学习顾问)回答时间:2008-10-08 20:32:25
ntwuhaohao
作业评语:好
教师点评:完成了所有作业的全部功能。
你的源程序
namespace UseEventExample
{
class Program
{
public delegate void MyMultiDelegate(int value);
public class publisher
{
public event MyMultiDelegate handlers;
public void firstEvest()
{
handlers(10);
}
}
public class Subscriber
{
public void Mymethod(int i)
{
Console.WriteLine(i);
}
}
static void Main(string[] args)
{
publisher p = new publisher();
Subscriber s1 = new Subscriber();
Subscriber s2 = new Subscriber();
p.handlers += s1.Mymethod;
p.handlers += s2.Mymethod;
p.firstEvest();
Console.ReadKey();
}
}
}
建议修改后的程序:
namespace UseEventExample
{
class Program
{
public delegate void MyMultiDelegate(int value);
//这里最好使用Publisher C#的命名惯例 类名首字母大写 使用Pascal命名,每个单词的首字母大写
public class Publisher
{
//这里最好使用MyHandler C#的命名惯例 公有的变量使用Pascal命名,而且没有必要用复数
public event MyMultiDelegate MyHandler;
//公有方法的命名应遵循Pascal命名,且为动词短语,事件(event)单词拼写有误
public void RaiseEvent()
{
//需要判断事件是否被注册
if (MyHandler != null)
{
MyHandler(10);
}
}
}
public class Subscriber
{
//公有方法的命名应遵循Pascal命名,且为动词短语
public void MyMethod(int i)
{
Console.WriteLine(i);
}
}
static void Main(string[] args)
{
Publisher p = new Publisher();
Subscriber s1 = new Subscriber();
Subscriber s2 = new Subscriber();
p.MyHandler += s1.MyMethod;
p.MyHandler += s2.MyMethod;
p.RaiseEvent();
Console.ReadKey();
}
}
}
窗体事件的作业完成要求
回答人:amandag(高歌 .NET学习顾问)回答时间:2008-10-08 21:47:54
woshigefantong
学员的作业描述:由于电脑坏掉,我拉下了很多课程,这个作业到现在才交上,写的很仓促。望老师见谅
作业评语:好
教师点评:完成了作业的全部功能。
回答人:amandag(高歌 .NET学习顾问)回答时间:2008-10-08 21:50:57
javadaonet
学员的作业描述:金老师解释‘多态编程’使用的那个动物园案例的确非常形象。此刻,正值‘神七’飞空,金老师的课程深深吸引了我,以至于听课都没有兴趣去关心航天科学,先自我批评一把。
从老师将动物园案例进行的两次‘改造’来看,其中第一次,我总结为‘运行时多态’;而第二次,应该是‘编译时多态’。这两个名词,是最近一边学习一边翻阅其他辅助书籍时发现的。起初没有感觉,但一听今天金老师的课程,马上有茅塞顿开的感觉。感谢老师,确有‘诲人不倦’的功效。
现在是第二天,在上班路上总结了一下‘多态’。其实,动物园那个案例,跟button控件事件与事件委托的例子非常相似。‘动物’这个类,等于‘button’类:具体的猫、狗、鸭子,就对应于窗体上实作出来的button1、button2、button3。喂食的方法,相当于事件委托。
具体喂食哪一个动物,相当于button控件与事件委托的‘一对多’关系,button控件点击下去,执行奇数次和偶数次的效果是不同的,相当于喂食动物具体喂食哪个不知道,是为‘运行时多态’。
而将所有的动物进行‘遍历’或曰枚举,其实是一种‘编译时多态’。相似的,button控件与事件委托,存在‘多对一’关系。也就是把button1、button2、button3‘遍历’一下,将所有会产生一致效果的button按钮的事件与委托进行绑定。这样也就达到了‘编译时多态’。
作业评语:好
教师点评:完成了作业的全部功能。
这位同学总结的很好,其实面向对象的编程一定要用面向对象的思想去考虑现实生活中的问题,这样就容易理解了。

我要回答

您还没有登录,请登录!