对着月亮唱歌的幸福生活

即便是莲藕内心真空之所,也有根根柔丝穿过。
  博客园  :: 首页  :: 联系 :: 管理

委托和事件的理解+我要去北京 (第一次添砖)

Posted on 2008-12-19 13:27  对月而歌  阅读(317)  评论(0)    收藏  举报

这找找,那摘摘在园子里呆了快一年了学了不少东西,这2天正学习委托和事件,把自己的理解做个笔记,第一次写技术文章.由于理解的甚是肤浅,所以给入门的同学们看看或许比深入抛析的牛人们写的文章更容易入门一些,许多不对之处还望前辈批评指正,恶意攻击者 漠视.

    我准备去北京找同学玩玩.但是钱不够,赞钱当我攒的钱够了1000块的时候,就可以去北京了,首先要同时帮忙去买票,然后通知我好朋友们让他们帮我做个北京玩的计划,事情基本就是这样.

   目前存款总数:totalMoney        (监视对象跟触发事件的条件)

 

 

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

namespace MyFistDelegate
{
    
//男同学类,男同学能做许多事情,其中一个事情就是能够帮我指定一个计划.
    class MyFriendPlan
    {
        
private string name;
        
public MyFriendPlan(string name)
        {
            
this.name = name;
        }
        
// 男同学的一些计划
        public void SomePlan(int money)
        {
            Console.WriteLine(
"如果分配给"+name+"男同学" + money + "元 ,他的计划是");
            Console.WriteLine(
"唱歌" );
        }
    }
    
// 女同学类,女同学能做许多事情,其中一个事情就是能够帮我指定一个计划.
    class MyGirlClassMate
    {
        
// 女同学的一些计划
        public void SomePlan(int money)
        {
            Console.WriteLine(
"如果分配给女同学");
            Console.WriteLine(
"买衣服"+money);
        }
    }
    
//同事,同事能做许多事情,其中一个事情就是能够帮我买票
    class Workmate
    {
        
public void GetTicket(int money)
        {
            Console.WriteLine(
"我已经有"+money+"同事帮忙去买票");
        }
    }
   
// 计划去北京的某人
    class People
    {
        
        
private int money;
        
public int totalMoney;//总存款,监视对象
        public People(int money)
        {
            
//构造函数 实例化出行人时,可以自由支配的钱数
            this.money = money;        
        }
       
        
public delegate void CallSomeOne(int money);   //创建委托,被委托之形参类型为 int  出行之前创建委托
        public event CallSomeOne CSO = null;            //创建触发委托的事件
        public void SaveMoney()
        {
               
for(int i=0;i<1500;i=i+100)          
                  {
                      totalMoney 
= i;//监视对象,事件触发的条件
                      Console.WriteLine("目前存款是" + totalMoney);
                      
if (totalMoney > 1000)
                      {
                          OnCSO(money);     
//如果总钱数大于1000那么就可以  拿出可以自由支配的钱数给同学进行预算,这里也可以对总钱数进行操作.
                      }
                  }                        
//触发事件
        }

        
protected virtual void OnCSO(int money)
        {
            
if (CSO != null)
            {
                Console.WriteLine(
"\n钱存够拉 我要去北京拉");
                
//事件的的形参要与 要实现的方法的形参一致  并且在被调用的方法里是可以使用的                                                   
                
//在事件被创立的时候并不知道会发生什么方法,只要方法的传入参数与委托声明的一致都可以与时间关联
                CSO(money);                             
            }
        }
    }
    
class Travel
    {
        
static void Main(string[] args)
        {
            MyFriendPlan F1 
= new MyFriendPlan("F1");    //有一个同学叫F1
            MyFriendPlan F2 = new MyFriendPlan("F2");    //有一个同学叫F2
            MyGirlClassMate G1 = new MyGirlClassMate();  //有个女同学
            Workmate W1 = new Workmate();                //有个同事
            People people = new People(1000);            //这个出行的我有给1000块可以给做计划的同学们
            
//事件触发具体实现,在触发之前并不知道要选择哪个对象的哪些方法将被实现
            people.CSO += new People.CallSomeOne(W1.GetTicket);//注册对象的方法到事件.
            people.CSO += new People.CallSomeOne(F1.SomePlan);   
            people.CSO 
+= new People.CallSomeOne(F2.SomePlan);
            people.CSO 
+= new People.CallSomeOne(G1.SomePlan);

            people.SaveMoney();      
//存钱.这个过程监视着钱数够了之后 自动触发注册过的对象的方法.
        }
    }
}

 

 

That All