您好,登錄后才能下訂單哦!
講解了一下委托跟事件的應(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();
}
}
免責(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)容。