今天我在做面試題的時(shí)候遇到這樣一個(gè)題目:
程序設(shè)計(jì): 貓大叫一聲,所有的老鼠都開始逃跑,主人被驚醒。(C#語言)
這道題考的是c#的多態(tài)那一部分,這樣的題網(wǎng)上很多,我很快從網(wǎng)上查到了答案,答案有兩種解法,解法一:這道題目其實(shí)是就是三個(gè)對象一系列的動(dòng)作,由貓引發(fā)聯(lián)動(dòng)效果,類似訂閱報(bào)紙,這讓我們很容易想到觀察者模式,通過接口編程的方式實(shí)現(xiàn),這個(gè)不多說。解法二:就是多態(tài)的舞臺了,通過抽象類,委托,事件實(shí)現(xiàn)。
廢話不多說,我想在這里說的不是解法,而是通過研究第二種解法我進(jìn)一步加深了對base這個(gè)關(guān)鍵字的理解,以及為什么這樣這用?在什么場合下咱們得想到她?我在網(wǎng)上查了好多,發(fā)現(xiàn)說的不太具體,很難理解!所以我自己用自己的話總結(jié)一下,就是希望大家尤其是新手都能真正的理解這個(gè)關(guān)鍵字。
首先,看看我找到的這個(gè)第二種解法吧!
public delegate void SubEventHander();
public abstract class Subject
{
public event SubEventHander SubEvent;
public void FireAway()
{
if (SubEvent != null)
SubEvent();
}
}
public abstract class Observer{
public Observer(Subject sub)
{
sub.SubEvent += new SubEventHander(Response);
}
public abstract void Response();
}
public class mouse:Observer {
private string _name;
public mouse(string name,Subject sub):base(sub)
{
this._name = name;
}
public override void Response()
{
Console.WriteLine("{0}跑了",this._name);
}
}
public class master : Observer
{
public master(Subject sub):base(sub){
}
public override void Response()
{
Console.WriteLine("主人驚醒了");
}
}
public class cat : Subject
{
public void cry()
{
Console.WriteLine("貓叫了");
this.FireAway();
}
}
咱們直接說和base有關(guān)的東西,上述代碼有兩處用到base,一個(gè)是mouse類的構(gòu)造函數(shù),另外一個(gè)是master類的構(gòu)造函數(shù),先暫時(shí)不要管這里為什么要用base,而且base
為什么還帶參數(shù)。首先,請你看一下這兩個(gè)類的基類的構(gòu)造函數(shù),你會(huì)發(fā)現(xiàn)什么問題?給讀者思考的一小段空間。。。。
你會(huì)發(fā)現(xiàn)基類的構(gòu)造函數(shù)使我們自定義的,我們想讓這兩個(gè)派生類在實(shí)例化的時(shí)候所調(diào)用的基類的構(gòu)造函數(shù)是我們自定義的這個(gè)構(gòu)造函數(shù),說到這里,我頓一下。我又問了,這和自定義的構(gòu)造函數(shù)有關(guān)系么?當(dāng)然有!因?yàn)橄到y(tǒng)在new一個(gè)類時(shí),會(huì)默認(rèn)在這個(gè)類里創(chuàng)建一個(gè)無參的構(gòu)造函數(shù),如果你后期自定義一個(gè)構(gòu)造函數(shù),這個(gè)自動(dòng)創(chuàng)建的構(gòu)造函數(shù)仍然存在,只不過我們看不到而已,也就說當(dāng)你自定義一個(gè)構(gòu)造函數(shù),在這個(gè)類里會(huì)存在兩個(gè)構(gòu)造函數(shù),一個(gè)是我們自定義的那個(gè),另外一個(gè)就是我們看不到的那個(gè)無參的構(gòu)造函數(shù)。說到這里,我想說一下,如果大牛們有不同意見,可以評論,大家一同探討。
我們繼續(xù),接下來問題又出現(xiàn)了,既然是兩個(gè)構(gòu)造函數(shù),當(dāng)我們的派生類實(shí)例化的時(shí)候,我們怎么能夠控制系統(tǒng)調(diào)用基類的哪個(gè)構(gòu)造函數(shù)呢?是那個(gè)自定義的無參構(gòu)造函數(shù)?還是我們自定義的那個(gè)呢?我們當(dāng)然知道基類必須調(diào)用的是我們自定義的那個(gè)構(gòu)造函數(shù)!因?yàn)槲覀円允录模?/p>
哈哈!現(xiàn)在主角該上場了!base就是我們解決這個(gè)問題的武器!只要我們在派生類構(gòu)造函數(shù)后面加上:base(這里是基類構(gòu)造函數(shù)的參數(shù),可以是多個(gè),注意是實(shí)例),這樣就能根據(jù)參數(shù)區(qū)分開調(diào)用那個(gè)構(gòu)造函數(shù)了。上述代碼中,我們需要調(diào)用Observer類的那個(gè)帶Subject變量參數(shù)的構(gòu)造函數(shù),所以我們要在這兩個(gè)派生類后面加:base(sub)
最后總結(jié)一下:
base關(guān)鍵字在于聲明派生類實(shí)例化時(shí)調(diào)用基類的哪一個(gè)構(gòu)造函數(shù),因?yàn)槿绻惒蛔远x構(gòu)造參數(shù),
系統(tǒng)默認(rèn)有一個(gè)無參的構(gòu)造函數(shù),因?yàn)閎ase()括號里是構(gòu)造函數(shù)的參數(shù),所以不填調(diào)用的是默認(rèn)的無參構(gòu)造函數(shù),
有參(可以是多個(gè))調(diào)用的是自定義的構(gòu)造函數(shù),如果自定義構(gòu)造參數(shù)記得使用base關(guān)鍵字指明基類的構(gòu)造函數(shù)
我再強(qiáng)調(diào)一下:上面都是我自己的總結(jié),如果有什么不到位的地方,如果大牛們有不同意見,可以評論,大家一同探討。謝謝支持!