zoukankan      html  css  js  c++  java
  • Delegate and event

    Here is a sample about delegate and event.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace TestHeaterDelegateSample
    {
        public class Program
        {
            public static void Main(string[] args)
            {
                Heater heater = new Heater();
                Monitor monitor = new Monitor();
    
                //The below can be modified with the below solution1.
                //HeaterEventHander hander = new HeaterEventHander(monitor.OnBoil);
                //heater.HeaterEvent += hander;
                heater.HeaterEvent += new HeaterEventHander(monitor.OnBoil);
    
                heater.OnHeater();
    
                Console.ReadLine();
            }
        }
    
        public delegate void HeaterEventHander(object sender, HeaterEventArgs e); // EventArgs doesn't have real data.
    
        public class HeaterEventArgs : EventArgs
        {
            private string alertText;
            public string AlertText
            {
                get { return ("The Temperatur is 100 degree now."); }
              //  set { alertText = value; }
            }
        }
    
        public class Heater 
        {
            private int temperature;
            private string alterText;
    
            private int Temperature
            {
                get { return temperature; }
                set { temperature = value; }
            }
            private string AlterText 
            {
                get { return alterText; }
                set { alterText = value; }
            }
            public event HeaterEventHander HeaterEvent;
           
            public void OnHeater()
            {
                this.temperature = 0;
                for (;;Temperature++ )
                {
                    if (Temperature >= 100)
                    {
                        Console.WriteLine("Thie is the event sender.");
                        HeaterEventArgs e = new HeaterEventArgs();
                        HeaterEvent(this, e);
                        break;
                        // Raise the water has boiled.
                    }
                }
            }
        }
    
        public class Monitor
        {
            public void OnBoil(object sender, HeaterEventArgs e)
            {
                Console.WriteLine("The sender data is: "+e.AlertText);
                Console.WriteLine("The water has boiled. And we have monitored it.");
            }
        }
    }

     And the below is the msdn sample. It's more perfect and ofcourse more difficult.

    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace TestClockAlarmSample
    {
        // Class that contains the data for
        // the alarm event. Derives from System.EventArgs.
        //
        public class AlarmEventArgs : EventArgs
        {
            private bool snoozePressed;
            private int nrings;
    
            //Constructor.
            //
            public AlarmEventArgs(bool snoozePressed, int nrings)
            {
                this.snoozePressed = snoozePressed;
                this.nrings = nrings;
            }
    
            // The NumRings property returns the number of rings
            // that the alarm clock has sounded when the alarm event
            // is generated.
            //
            public int NumRings
            {
                get { return nrings; }
            }
    
            // The SnoozePressed property indicates whether the snooze
            // button is pressed on the alarm when the alarm event is generated.
            //
            public bool SnoozePressed
            {
                get { return snoozePressed; }
            }
    
            // The AlarmText property that contains the wake-up message.
            //
            public string AlarmText
            {
                get
                {
                    if (snoozePressed)
                    {
                        return ("Wake Up!!! Snooze time is over.");
                    }
                    else
                    {
                        return ("Wake Up!");
                    }
                }
            }
        }
    
        // Delegate declaration.
        //
        public delegate void AlarmEventHandler(object sender, AlarmEventArgs e);
    
        // The Alarm class that raises the alarm event.
        //
        public class AlarmClock
        {
            private bool snoozePressed = false;
            private int nrings = 0;
            private bool stop = false;
    
            // The Stop property indicates whether the
            // alarm should be turned off.
            //
            public bool Stop
            {
                get { return stop; }
                set { stop = value; }
            }
    
            // The SnoozePressed property indicates whether the snooze
            // button is pressed on the alarm when the alarm event is generated.
            //
            public bool SnoozePressed
            {
                get { return snoozePressed; }
                set { snoozePressed = value; }
            }
    
            // The event member that is of type AlarmEventHandler.
            //
            public event AlarmEventHandler Alarm;
    
            // The protected OnAlarm method raises the event by invoking
            // the delegates. The sender is always this, the current instance
            // of the class.
            //
            protected virtual void OnAlarm(AlarmEventArgs e)
            {
                AlarmEventHandler handler = Alarm;
                if (handler != null)
                {
                    // Invokes the delegates.
                    handler(this, e);
                }
            }
    
            // This alarm clock does not have
            // a user interface.
            // To simulate the alarm mechanism it has a loop
            // that raises the alarm event at every iteration
            // with a time delay of 300 milliseconds,
            // if snooze is not pressed. If snooze is pressed,
            // the time delay is 1000 milliseconds.
            //
            public void Start()
            {
                for (; ; )
                {
                    nrings++;
                    if (stop)
                    {
                        break;
                    }
                    else
                    {
                        if (snoozePressed)
                        {
                            System.Threading.Thread.Sleep(1000);
                        }
                        else
                        {
                            System.Threading.Thread.Sleep(300);
                        }
                        AlarmEventArgs e = new AlarmEventArgs(snoozePressed, nrings);
                        OnAlarm(e);
                    }
                }
            }
        }
    
        // The WakeMeUp class has a method AlarmRang that handles the
        // alarm event.
        //
        public class WakeMeUp
        {
            public void AlarmRang(object sender, AlarmEventArgs e)
            {
                Console.WriteLine(e.AlarmText + "
    ");
    
                if (!(e.SnoozePressed))
                {
                    if (e.NumRings % 10 == 0)
                    {
                        Console.WriteLine(" Let alarm ring? Enter Y");
                        Console.WriteLine(" Press Snooze? Enter N");
                        Console.WriteLine(" Stop Alarm? Enter Q");
                        String input = Console.ReadLine();
    
                        if (input.Equals("Y") || input.Equals("y"))
                        {
                            return;
                        }
                        else if (input.Equals("N") || input.Equals("n"))
                        {
                            ((AlarmClock)sender).SnoozePressed = true;
                            return;
                        }
                        else
                        {
                            ((AlarmClock)sender).Stop = true;
                            return;
                        }
                    }
                }
                else
                {
                    Console.WriteLine(" Let alarm ring? Enter Y");
                    Console.WriteLine(" Stop Alarm? Enter Q");
                    String input = Console.ReadLine();
                    if (input.Equals("Y") || input.Equals("y"))
                    {
                        return;
                    }
                    else
                    {
                        ((AlarmClock)sender).Stop = true;
                        return;
                    }
                }
            }
        }
    
    
        // The driver class that hooks up the event handling method of
        // WakeMeUp to the alarm event of an Alarm object using a delegate.
        // In a forms-based application, the driver class is the
        // form.
        //
        public class AlarmDriver
        {
            public static void Main(string[] args)
            {
                // Instantiates the event receiver.
                WakeMeUp w = new WakeMeUp();
    
                // Instantiates the event source.
                AlarmClock clock = new AlarmClock();
    
                // Wires the AlarmRang method to the Alarm event.
                clock.Alarm += new AlarmEventHandler(w.AlarmRang);
    
                clock.Start();
            }
        }
    }
    View Code
  • 相关阅读:
    萌新向Python数据分析及数据挖掘 第三章 机器学习常用算法 第三节 梯度下降法 (上)理解篇
    萌新向Python数据分析及数据挖掘 第三章 机器学习常用算法 第二节 线性回归算法 (下)实操篇
    萌新向Python数据分析及数据挖掘 第三章 机器学习常用算法 第二节 线性回归算法 (上)理解篇
    萌新向Python数据分析及数据挖掘 第三章 机器学习常用算法 第一节 KNN算法 (下)实操篇
    萌新向Python数据分析及数据挖掘 第三章 机器学习常用算法 第一节 KNN算法 (上)理解篇
    萌新向Python数据分析及数据挖掘 第二章 pandas 第五节 Getting Started with pandas
    Oracle数据库安装和授权
    c# 如何获取JSON文件以及如何获取Config文件(framework 和 net .Core)
    C#Core查询数据库存储EXCEL文件
    如何在WINDOW系统下编译P12证书制作
  • 原文地址:https://www.cnblogs.com/bg57/p/3491472.html
Copyright © 2011-2022 走看看