最近看到C#裡面的抽象類別和介面,還有索引器。

來源:互聯網
上載者:User

 看完抽象類別的時候,感覺這個不錯,只要在父類中寫一個方法體,在子類中要引用的時候,直接override就可以。在學完介面後,感覺到介面在這方面更好,因為在C#中,類都是單根繼承的,如果有多個方法,要重寫的時候,那引用介面多好啊,後面增加的時候也方便。

  當看到person p=new son()這個的時候,感覺有點奇怪,因為開始看的時候都是person p=new person(),或者son s=new son()的,那person p=new son()(父類引用指向子類的對象).到底有什麼好處呢,如果子類中覆蓋了父類中的方法,則調用子類中的方法,否則調用父類的方法。以下是引用來自的“滴d” 部落格的內容。

關於父類引用指向子類對象

很多人在初次接觸設計模式的時候,最大的疑惑莫過於碰到這樣的句子:(父類Animal和子類Dog) 

Animal a2 = new Dog();

這是什麼玩意兒?究竟有什麼用途,我直接用子類對象不就完了?

我們就來解釋一下:
--這是什麼玩意兒?
re:這種用法叫做“父類引用指向子類對象”(跟繞口令似的),或者叫“父類指標指向子類對象”,指的是定義一個父類的引用,而它實際指向的是子類建立的對象。功能上相當於子類的“向上轉型”,或者“上溯對象”,
上面的語句也可以寫成:

Animal a2 = new Animal();
Dog    dog = new Dog();
a2 = dog;

將子類對象賦給父類的引用就是向上轉型,Animal a2 = new Dog();中的new Dog()就是執行個體化一個沒有名字的對象,然後轉型給父類的引用a2,僅此而已。

--究竟有什麼用途?
re:一般來說,一個對象執行個體建立完就定死了,比如dog,如果程式裡的變數寫dog的話,萬一以後發生變化就要改代碼了。那麼事先就不寫死dog,而是寫父類Animal,那麼以後用到Animal的地方,用dog執行個體,cat執行個體都可以取代,不用改執行個體名了。說玄乎一點,也就體現了物件導向“多態”的特性。

下面看一個很簡單的例子,就更加明白了:

    class Animal
    {
        private String type = "Animal";
        public virtual void showLegs()
        {
            Console.WriteLine("This is an {0} , Animal always has legs",type);
        }
    }
    class Dog : Animal
    {
        private String type = "Dog";
        public override void showLegs()
        {
            Console.WriteLine("This is a {0} , Dog has four legs", type);
        }
    }
    class Glede : Animal
    {
        private String type = "Glede";
        public override void showLegs()
        {
            Console.WriteLine("This is a {0} , Glede has two legs",type);
        }
    }

    class test
    {
        static void Main(string[] args)
        {
            Animal a1 = new Animal();
            Animal a2 = new Dog();
            Animal a3 = new Glede();
            a1.showLegs();
            a2.showLegs();
            a3.showLegs();
            Console.ReadLine();
        }
    }

 

 結果:

This is an Animal , Animal always has legs
This is a Dog , Dog has four legs
This is a Glede , Glede has two legs

 

真正明白了這些,也就該接觸設計模式領域了。

最後嘮叨兩句:

·因為a2,a3都是子類的對象,所以調用起來,也都是調用的子類的方法(當然前提是它們都override了父類方法,諸位可以試著把兩個子類中的override替換成new,結果就完全不一樣),有人把這叫做“關注對象原則”。

·向上轉型是一定沒有錯的,就好比你說“狗是動物”是成立的,反之,向下轉型就要注意了,你不能說“動物是狗”。

也不知道說明白沒有,先下了。。。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.