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