作者jodo1984 (XDDD)
看板C_Sharp
标题[问题] delegate & event
时间Sat Aug 8 22:55:23 2015
刚刚看 "Visual C# 2010 程式设计经典" 里面的一段委派的范例
试着新增一些功能,结果出现下面这一段错误
无法将型别 'appDelPractice.SlowSpeedEvent'
隐含转换为 'appDelPractice.DangerEvent'
主要想将原本 DangerEvent 绑定一个事件改为两个事件
片段程式码如下:
delegate int DangerEvent(int vSpeed);
delegate void SlowSpeedEvent(int vSpeed);
public partial class Form1 : Form
{
int TooFast(int vSpeed)
{
MessageBox.Show(String.Format("你目前的速度为{0},
超过200 请减速慢行!!", vSpeed));
return 100;
}
void TooSlow(int vSpeed)
{
MessageBox.Show(String.Format("您目前行驶速度{0}已低於限速80,
请加速行驶", vSpeed));
}
private void button1_Click(object sender, EventArgs e)
{
Car Benz = new Car();
Benz.Danger += new DangerEvent(TooFast);
Benz.Danger += new SlowSpeedEvent(TooSlow);
Benz.Speed = 22;
MessageBox.Show(String.Format("汽车智慧系统自动减速至
{0}!!", Benz.Speed));
}
}
class Car
{
private int _speed; //区域变数
public string sName { get; set; }
public event DangerEvent Danger;
public int Speed
{
get
{
return _speed;
}
set
{
if (value > 200)
{
if (Danger != null)
value = Danger(value);
}
else if(value < 80)
{
if (Danger != null)
value = Danger(value);
}
_speed = value;
}
}
}
最近刚从 写vb6 改为 写C#
关於一些物件导向的一些观念还蛮薄弱,
如果各位先进觉得我问的东西太基本还请见谅
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 114.39.147.7
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/C_Sharp/M.1439045725.A.BA4.html
※ 编辑: jodo1984 (114.39.147.7), 08/08/2015 22:56:42
1F:→ ssccg: DangerEvent就是DangerEvent,不能放SlowSpeedEvent 08/08 23:15
2F:→ ssccg: 你有什麽两个handler一定要用不同signature的理由吗 08/08 23:16
3F:→ ssccg: 把TooSlow一样改成回int,然後new DangerEvent(TooSlow) 08/08 23:17
改回来变成这样子, 但又遇到另一个问题
我想要程式自行判断去呼叫 TooFast 或 TooSlow
但是当我设定 Benz.Speed = 22; 时
虽然进入Car class 跑到
else if(value < 80)
{
if (Danger != null)
value = Danger(value);
}
但是却变成TooFast与TooSlow 都会各执行一遍
有办法可以只执行TooFast 或 TooSlow 吗?
修正後程式码
private void button1_Click(object sender, EventArgs e)
{
Car Benz = new Car();
Benz.Danger += new DangerEvent(TooFast);
Benz.Danger += new DangerEvent(TooSlow);
Benz.Speed = 22;
}
class Car
{
private int _speed; //区域变数
public string sName { get; set; }
public event DangerEvent Danger;
public int Speed
{
get
{
return _speed;
}
set
{
if (value > 200)
{
if (Danger != null)
value = Danger(value);
}
else if(value < 80)
{
if (Danger != null)
value = Danger(value);
}
_speed = value;
}
}
}
※ 编辑: jodo1984 (114.39.147.7), 08/08/2015 23:36:57
4F:推 wulouise: 把else if的if去掉就好吧? 可能你当时Danger(value)< 80 08/09 10:14
5F:推 fo40225: 因为你Danger绑了两个方法 执行Danger两个方法都会执行 08/09 10:46
6F:推 wulouise: err抱歉我不知道我刚才眼睛在看什麽,回的东西莫名其妙 08/09 11:59
7F:→ largesperm: 现在不是都不推这个方法了吗 08/18 18:07