码迷,mamicode.com
首页 > 其他好文 > 详细

委托实现音乐播放器 | 委托实现音乐播放器的缺点 | 事件实现音乐播放器

时间:2015-05-16 01:29:53      阅读:123      评论:0      收藏:0      [点我收藏+]

标签:委托

1,使用委托实现一个音乐播放器的功能呢。(模拟事件)

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

namespace 模拟事件
{
    /// <summary>
    /// 音乐播放器类
    /// </summary>
    public class MusicPlayer
    {
        //1.音乐开始后触发某些事件
        public  Action AfterPlayMusic;


        //2.音乐停止前触发某些事件
        public Action BeforeEndMusic;


        /// <summary>
        /// 开始播放音乐
        /// </summary>
        private void PlayMusic()
        {
            Console.WriteLine("开始播放音乐");
        }

        /// <summary>
        /// 按下【播放】按钮实现播放音乐
        /// </summary>
        public void StartPlay()
        {
            PlayMusic();
            if (AfterPlayMusic != null) //音乐开始播放后,判断这个委托是否为空,如果不为空就执行一些事件
            {
                AfterPlayMusic(); //这里就相当于一个事件
            }
            Thread.Sleep(3000);//让系统睡3秒钟(音乐播放时间)
        }

        /// <summary>
        /// 音乐播放完毕
        /// </summary>
        public void EndMusic()
        {
            if (BeforeEndMusic != null)  //音乐播放完毕之前,判断这个委托是否为空,如果不为空就执行一些事件
            {
                BeforeEndMusic(); 
            }
            Console.WriteLine("音乐播放完毕!");
        }

    }
    //------------------------------------------------------------------//
    class Program
    {
        static void Main(string[] args)
        {
            //现在我们来使用这个音乐播放器类
            MusicPlayer mp3 = new MusicPlayer();

            //给委托赋值
            mp3.AfterPlayMusic = () =>  
            {
                Console.WriteLine("加载歌词!"); 
                Console.WriteLine("加载动感音符!");
                
            };

            //给委托赋值
            mp3.BeforeEndMusic = () =>  
            {
                Console.WriteLine("删除歌词!");
                Console.WriteLine("停止动感音符!");
            };


            mp3.StartPlay(); //按下播放按钮,

            mp3.EndMusic(); //音乐播放完毕


            Console.ReadKey();
        }
    }
}

技术分享


//-------------------但是这个委托实现音乐播放器也有很大的缺点,下面我们来看看改了最后一点点的代码---------------------------//

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

namespace 模拟事件
{
    /// <summary>
    /// 音乐播放器类
    /// </summary>
    public class MusicPlayer
    {
        //1.音乐开始后触发某些事件
        public  Action AfterPlayMusic;


        //2.音乐停止前触发某些事件
        public Action BeforeEndMusic;


        /// <summary>
        /// 开始播放音乐
        /// </summary>
        private void PlayMusic()
        {
            Console.WriteLine("开始播放音乐");
        }

        /// <summary>
        /// 按下【播放】按钮实现播放音乐
        /// </summary>
        public void StartPlay()
        {
            PlayMusic();
            if (AfterPlayMusic != null) //音乐开始播放后,判断这个委托是否为空,如果不为空就执行一些事件
            {
                AfterPlayMusic(); //这里就相当于一个事件
            }
            Thread.Sleep(3000);//让系统睡3秒钟(音乐播放时间)
        }

        /// <summary>
        /// 音乐播放完毕
        /// </summary>
        public void EndMusic()
        {
            if (BeforeEndMusic != null)  //音乐播放完毕之前,判断这个委托是否为空,如果不为空就执行一些事件
            {
                BeforeEndMusic(); 
            }
            Console.WriteLine("音乐播放完毕!");
        }

    }
    //------------------------------------------------------------------//
    class Program
    {
        static void Main(string[] args)
        {
            //现在我们来使用这个音乐播放器类
            MusicPlayer mp3 = new MusicPlayer();

            //给委托赋值
            mp3.AfterPlayMusic = () =>  
            {
                Console.WriteLine("加载歌词!");
                Console.WriteLine("加载动感音符!\n\n");
                
            };

            //给委托赋值
            mp3.BeforeEndMusic = () =>  
            {
                Console.WriteLine("删除歌词!");
                Console.WriteLine("停止动感音符!");
            };

            //现在我想搞点破坏....我不执行下面两段代码了

            //mp3.StartPlay(); //按下播放按钮,

            //mp3.EndMusic(); //音乐播放完毕

            //既然我在上面给AfterPlayMusic和BeforeEndMusic这两个委托已经赋值了。我这里就直接执行这两个委托
            mp3.AfterPlayMusic();
            mp3.BeforeEndMusic();


            Console.ReadKey();
        }
    }
}
技术分享


//-----------------------------------下面我们来看看使用事件实现音乐播放器的时候,看我们能不能再搞破坏了--------------------//

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

namespace 模拟事件
{
    /// <summary>
    /// 音乐播放器类
    /// </summary>
    public class MusicPlayer
    {
        //1.音乐开始后触发某些事件
        public event Action AfterPlayMusic;


        //2.音乐停止前触发某些事件
        public event Action BeforeEndMusic;


        /// <summary>
        /// 开始播放音乐
        /// </summary>
        private void PlayMusic()
        {
            Console.WriteLine("开始播放音乐");
        }

        /// <summary>
        /// 按下【播放】按钮实现播放音乐
        /// </summary>
        public void StartPlay()
        {
            PlayMusic();
            if (AfterPlayMusic != null) //音乐开始播放后,判断这个委托是否为空,如果不为空就执行一些事件
            {
                AfterPlayMusic(); //这里就相当于一个事件
            }
            Thread.Sleep(3000);//让系统睡3秒钟(音乐播放时间)
        }

        /// <summary>
        /// 音乐播放完毕
        /// </summary>
        public void EndMusic()
        {
            if (BeforeEndMusic != null)  //音乐播放完毕之前,判断这个委托是否为空,如果不为空就执行一些事件
            {
                BeforeEndMusic(); 
            }
            Console.WriteLine("音乐播放完毕!");
        }

    }
    //------------------------------------------------------------------//
    class Program
    {
        static void Main(string[] args)
        {
            //现在我们来使用这个音乐播放器类
            MusicPlayer mp3 = new MusicPlayer();

            //给委托赋值
            mp3.AfterPlayMusic += () =>  
            {
                Console.WriteLine("加载歌词!");
                Console.WriteLine("加载动感音符!\n\n");
                
            };

            //给委托赋值
            mp3.BeforeEndMusic += () =>  
            {
                Console.WriteLine("删除歌词!");
                Console.WriteLine("停止动感音符!");
            };

            //现在我想搞点破坏....我不执行下面两段代码了

            //mp3.StartPlay(); //按下播放按钮,

            //mp3.EndMusic(); //音乐播放完毕

            //既然我在上面给AfterPlayMusic和BeforeEndMusic这两个事件已经赋值了。我这里就直接执行这两个事件

            //mp3.AfterPlayMusic(); //发现直接执在MusicPlayer类外面执行MusicPlayer类的AfterPlayMusic事件报错了
            //mp3.BeforeEndMusic(); //发现直接执在MusicPlayer类外面执行MusicPlayer类的BeforeEndMusic事件报错了

            //最后我们得出结论:
            //1.当在一个类的内部定义了一个事件,那么事件在定义事件的类的外部不能直接调用
            //2.当在一个类的内部定义了一个事件,那么事件只能在定义事件的类的内部触发(调用)


            Console.ReadKey();
        }
    }
}

我们发现,我们不能搞破坏了。如果不按下播放按钮,音乐就不会开始。 也不会出现没有播放音乐就出现加载歌词,加载动感音符这种不合理的事情了



委托实现音乐播放器 | 委托实现音乐播放器的缺点 | 事件实现音乐播放器

标签:委托

原文地址:http://blog.csdn.net/fanbin168/article/details/45753519

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!