溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

[C#]貓叫人醒老鼠跑 C#的委托及事件

發(fā)布時(shí)間:2020-06-26 17:16:10 來源:網(wǎng)絡(luò) 閱讀:446 作者:蓬萊仙羽 欄目:開發(fā)技術(shù)

    講解了一下委托跟事件的應(yīng)用,說實(shí)話這個(gè)東西聽起來還是一頭霧水,雖然學(xué)會(huì)怎么用,但是還沒搞明白需要在什么時(shí)候用到這個(gè),后來我們經(jīng)理給我舉了個(gè)例子,讓我做一個(gè)經(jīng)典的委托和事件的例子,就是貓叫人醒老鼠跑。

      首先很簡(jiǎn)單,需要定義貓,人跟老鼠三個(gè)類,分別命名為Cat,People,Mouse,在這里我還寫了一個(gè)接口,里面寫了一個(gè)void Action(),用以實(shí)現(xiàn)多態(tài),People和Mouse兩個(gè)類繼承了這個(gè)接口并實(shí)現(xiàn),然后定義一個(gè)委托public delegate void Scream(), 返回類型為void,然后在Cat類中定義一個(gè)事件public event Scream scream,用來接下里的事件綁定。接下來要寫一個(gè)虛擬類,來作為一個(gè)觀察者,而Cat類是作為一個(gè)被觀察者,當(dāng)Cat類中的方法被調(diào)用以后,觸發(fā)綁定在事件里面的方法,這里我寫了一個(gè)虛類來扮演觀察者的角色,Cat類做為被觀察者,當(dāng)Cat類被調(diào)用呢,觀察者告訴另外兩個(gè)類Cat類已經(jīng)被調(diào)用,然后這兩個(gè)類各自實(shí)現(xiàn)相應(yīng)的方法,也就是說觀察者觀察到貓叫了一聲以后告訴人和老鼠,人就醒過來,而老鼠就開始跑,這就是同一件事情引發(fā)的不同角色的不同動(dòng)作,而虛類的構(gòu)造函數(shù)方法來綁定虛方法Action()。虛類的代碼如下:

      public abstract class Observer : IScream
    {
        protected Cat cat{get;set;}
        public Observer(Cat cat)
        {
            this.cat = cat;
            this.cat.scream += Action;
        }
        public abstract void Action();
    }

      人跟老鼠的類繼承自這個(gè)虛類,通過重寫虛方法Action來達(dá)到實(shí)現(xiàn)多態(tài)的效果,然后通過base來調(diào)用父類的構(gòu)造函數(shù),人跟老鼠類的代碼如下:

    class Person:Observer
    {
        public override void Action()
        {
            Console.WriteLine("主人醒來了");
        }
        public Person(Cat cat) : base(cat)
        {
        }
    }  

     class Mouse : Observer
    {
        public override void Action()
        {
            Console.WriteLine("老鼠跑了");
        }
        public Mouse(Cat cat) : base(cat)
        {
        }
    }

     這樣定義好了以后,最后只要調(diào)用Cat類的方法就能實(shí)現(xiàn)預(yù)期效果,整體代碼如下:

 public delegate void Scream();
    public class Cat
    {        
        public event Scream scream;         
        public void Action()
        {
            Console.WriteLine("貓叫了一聲");
            scream();
        }        
    }

    public abstract class Observer : IScream
    {
        protected Cat cat{get;set;}
        public Observer(Cat cat)
        {
            this.cat = cat;
            this.cat.scream += Action;
        }
        public abstract void Action();
    }

    class Mouse : Observer
    {
        public override void Action()
        {
            Console.WriteLine("老鼠跑了");
        }
        public Mouse(Cat cat) : base(cat)
        {
        }
    }

    class Person:Observer
    {
        public override void Action()
        {
            Console.WriteLine("主人醒來了");
        }
        public Person(Cat cat) : base(cat)
        {
        }
    }   

    class Program
    {        
        static void Main(string[] args)
        {
            Cat cat = new Cat();
            Person p = new Person(cat);
            Mouse m = new Mouse(cat);
            cat.Action();
            Console.ReadLine();
        }
    }

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI