西西軟件下載最安全的下載網(wǎng)站、值得信賴的軟件下載站!

首頁編程開發(fā)C#.NET → C#語言牢固掌握base關(guān)鍵字的使用技巧

C#語言牢固掌握base關(guān)鍵字的使用技巧

相關(guān)軟件相關(guān)文章發(fā)表評論 來源:創(chuàng)業(yè)男生時(shí)間:2013/2/17 21:29:05字體大小:A-A+

作者:創(chuàng)業(yè)男生點(diǎn)擊:0次評論:1次標(biāo)簽: base

Access database engine 2007免費(fèi)中文版
  • 類型:數(shù)據(jù)庫類大小:24.5M語言:中文 評分:2.3
  • 標(biāo)簽:
立即下載

今天我在做面試題的時(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é),如果有什么不到位的地方,如果大牛們有不同意見,可以評論,大家一同探討。謝謝支持!

    相關(guān)評論

    閱讀本文后您有什么感想? 已有人給出評價(jià)!

    • 8 喜歡喜歡
    • 3 頂
    • 1 難過難過
    • 5 囧
    • 3 圍觀圍觀
    • 2 無聊無聊

    熱門評論

    最新評論

    發(fā)表評論 查看所有評論(1)

    昵稱:
    表情: 高興 可 汗 我不要 害羞 好 下下下 送花 屎 親親
    字?jǐn)?shù): 0/500 (您的評論需要經(jīng)過審核才能顯示)