通过委托来设计一组投票器
这是传智播客以前的一个案例,还是挺经典的
委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Switch)语句,同时使得程序具有更好的可扩展性。
定义了委托之后,通过委托来传递参数,这一点在传递一些特殊的状态时可以用到,比如说我有好几种状态,我可以通过委托来触发
1.窗体设计
2.代码部分
委托具体实现过程先声明,再实例化
using DelegateApp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Reflection; using System.Windows.Forms; //喜科堂.Net开发技术学习网站:xiketang.ke.qq.com namespace DelegateApp { public partial class FrmShowRestult : Form { #region 基于OOP方式进行程序设计 //1.声明委托 public delegate void StartVoteDelegate(int num); //创建集合保存嘉宾对象 private Dictionary<int, Guest> dicGuest = null; private List<Form> frmList = new List<Form>(); public FrmShowRestult() { InitializeComponent(); this.dicGuest = new Dictionary<int, Guest>() { [1] = new Guest { Number = 1, Name = "李**" }, [2] = new Guest { Number = 2, Name = "王**" }, [3] = new Guest { Number = 3, Name = "赵**" } }; } //2.根据委托原型编写对应的方法 private void Receiver(int num) { //根据序号找到嘉宾对象,并使投票总数加1 this.dicGuest[num].VoteCounter++; //同步显示投票结果(后面还可以继续封装) this.lblCounter1.Text = this.dicGuest[1].VoteCounter.ToString(); this.lblCounter2.Text = this.dicGuest[2].VoteCounter.ToString(); this.lblCounter3.Text = this.dicGuest[3].VoteCounter.ToString(); } #endregion private void btnStartVote_Click(object sender, EventArgs e) { int counter = Convert.ToInt32(this.txtCounter.Text.Trim()); for (int i = 0; i < counter; i++) { //通过反射创建窗体(根据一个类的命名空间+类名的方式创建对象) FrmVote frmVote = (FrmVote)Assembly.Load("DelegateApp").CreateInstance("DelegateApp.FrmVote"); frmVote.Text = "投票器:" + (i + 1).ToString(); //4.将投票长提中的委托变量,和当前窗体中的方法进行关联 frmVote.voteDelegate = this.Receiver; frmVote.Show(); this.frmList.Add(frmVote); } } private void btnEndVote_Click(object sender, EventArgs e) { foreach (Form item in this.frmList) { item.Close(); } } } }
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using static DelegateApp.FrmShowRestult; namespace DelegateApp { public partial class FrmVote : Form { //3.创建委托遍历(将来通过外部赋值) public StartVoteDelegate voteDelegate = null; public FrmVote() { InitializeComponent(); //将三个按钮的事件关联 this.btnVote1.Click += new EventHandler(this.btnVote_Click); this.btnVote2.Click += new EventHandler(this.btnVote_Click); this.btnVote3.Click += new EventHandler(this.btnVote_Click); } //开始投票 private void btnVote_Click(object sender, EventArgs e) { Button btn = (Button)sender; //5.通过委托变量传递数据 voteDelegate(Convert.ToInt32(btn.Tag)); foreach (Control item in this.Controls) { if (item is Button) { item.Enabled = false; this.Text = "投票完成"; } } } } }