通过委托来设计一组投票器

这是传智播客以前的一个案例,还是挺经典的

委托是一个类,它定义了方法的类型,使得可以将方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用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 = "投票完成";
                }
            }
        
        }
    }
}

 

posted @ 2019-11-12 20:02  饮雪俊枫  阅读(232)  评论(0编辑  收藏  举报