[問題] delegate & event

看板C_Sharp作者 (XDDD)時間8年前 (2015/08/08 22:55), 8年前編輯推噓3(304)
留言7則, 4人參與, 最新討論串1/3 (看更多)
剛剛看 "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://www.ptt.cc/bbs/C_Sharp/M.1439045725.A.BA4.html ※ 編輯: jodo1984 (114.39.147.7), 08/08/2015 22:56:42

08/08 23:15, , 1F
DangerEvent就是DangerEvent,不能放SlowSpeedEvent
08/08 23:15, 1F

08/08 23:16, , 2F
你有什麼兩個handler一定要用不同signature的理由嗎
08/08 23:16, 2F

08/08 23:17, , 3F
把TooSlow一樣改成回int,然後new DangerEvent(TooSlow)
08/08 23:17, 3F
改回來變成這樣子, 但又遇到另一個問題 我想要程式自行判斷去呼叫 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

08/09 10:14, , 4F
把else if的if去掉就好吧? 可能你當時Danger(value)< 80
08/09 10:14, 4F

08/09 10:46, , 5F
因為你Danger綁了兩個方法 執行Danger兩個方法都會執行
08/09 10:46, 5F

08/09 11:59, , 6F
err抱歉我不知道我剛才眼睛在看什麼,回的東西莫名其妙
08/09 11:59, 6F

08/18 18:07, , 7F
現在不是都不推這個方法了嗎
08/18 18:07, 7F
文章代碼(AID): #1LnXXTka (C_Sharp)
文章代碼(AID): #1LnXXTka (C_Sharp)