C#委托使用

C#委托使用案例

委托的使用

假定有两个对象A和B,在A中实例化了对象B,那么A可以访问B中的方法,反过来B不能直接访问A中的方法,所以使用委托。
委托的使用步骤:条件(在A对象中实例化了B)
(1)、在B中声明一个委托原型
(2)、在A中根据委托原型编写所需要的委托方法
(3)、在B中利用声明的委托原型声明一个委托变量
(4)、在A中通过委托变量和委托方法关联

投票器类的抽取

根据面向对象编程原则抽取的类:(1)选秀平台类;(2)嘉宾类;(3)投票器类;(4)投票结果展示类;

Guest.cs(嘉宾类)

图片: ![Alt](using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace Vote.Models
{
///
/// 嘉宾类
///
public class Guest
{
public string GuestName { get; set; }//嘉宾姓名
public int GuestId { get; set; }//嘉宾号码
public int VoteCounter { get; set; } = 0;//所得票数
}
}

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

MyProgramer.cs(选秀平台类)

namespace Vote.Models
{
///
/// 嘉宾选秀的平台
///
public class MyProgramer
{
//创建一组嘉宾
public Dictionary Guests;
public MyProgramer()
{
Guests = new Dictionary(){
[1] = new Guest() { GuestId = 1,GuestName=“山云伟” },
[2]=new Guest() { GuestId=2,GuestName=“韩涛”},
[3]=new Guest() {GuestId=3,GuestName=“张建坤” }
};
}
}
}

FrmMainA.cs(结果展示界面类)

using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Vote
{
public partial class FrmMainA : Form
{

    Models.MyProgramer objMyProgramer = new Models.MyProgramer();//创建一个嘉宾选秀平台对象

    private List
objList = new List();//定义一个窗口泛型集合用于结束投票时关闭所有投票窗口 public FrmMainA() { InitializeComponent(); } //产生指定个数的投票器 private void btnStart_Click(object sender, EventArgs e) { int count = Convert.ToInt32(this.txtNumber.Text.Trim()); for (int i=1;i<=count;i++) { FrmVoteB objFrmVoteB = new FrmVoteB(i); objFrmVoteB.Show(); objFrmVoteB.sendMsgDelegate += SendMsg; //委托使用(4)将B对象的委托变量和根据委托原型编写的方法绑定在一起 objList.Add(objFrmVoteB);//将投票器循环添加到集合中 } } //委托使用(3)根据委托原型在需要 B对象调用的方法 public void SendMsg(int num) { objMyProgramer.Guests[num].VoteCounter++;//调用MyProgramer类的Guests[1/2/3 ]的VoteCounter属性并++ //在界面显示 this.lbl1.Text = objMyProgramer.Guests[1].VoteCounter.ToString(); this.lbl2.Text = objMyProgramer.Guests[2].VoteCounter.ToString(); this.lbl3.Text = objMyProgramer.Guests[3].VoteCounter.ToString(); } //结束投票 private void btnEnd_Click(object sender, EventArgs e) { foreach (Form item in objList) { item.Close(); } } }

}
C#委托使用_第1张图片

FrmVoteB.cs(投票器界面类)

using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Vote
{
public partial class FrmVoteB : Form
{

    public event SendMsgDelegate sendMsgDelegate;//委托使用(2)根据委托声明定义一个委托变量
    public FrmVoteB()
    {
        InitializeComponent();
    }
    public FrmVoteB(int i) : this()
    {
        this.Text = i + "号投票器";
        //委托使用(6)关联事件
        this.btn1.Click += new System.EventHandler(this.btn_Click);
        this.btn2.Click += new System.EventHandler(this.btn_Click);
        this.btn3.Click += new System.EventHandler(this.btn_Click);
    }
    //委托使用(5)在A中调用B中的方法
    private void btn_Click(object sender, EventArgs e)
    {
        Button btn = (Button)sender;
        int num = Convert.ToInt32(btn.Tag);
        sendMsgDelegate(num);
        //投一次票后禁用投票按键
        this.btn1.Enabled=this.btn2.Enabled=this.btn3.Enabled = false;
    }
    
}
//委托使用(1)定义一个委托原型(谁使用谁声明)
public delegate void SendMsgDelegate(int num);//参数为嘉宾号

}
C#委托使用_第2张图片

运行结果如下

C#委托使用_第3张图片

你可能感兴趣的:(C#,.NET全栈开发技术)