物件導向基礎(2)--抽象類 介面 集合 泛型

fan_rockrock發表於2014-03-14

接上一篇講:

一.抽象類和介面:

     1.抽象類:

                我們觀察發現,Animal類其實根本就不可能例項化,動物是一個抽象名詞,沒有具體物件與之對應,可以把例項化沒有意義的類改成抽象類,同樣getShoutSound函式也沒有                   任 何意義,可以將virtual修飾符修改為abstract,使之成為抽象方法     

    abstract class Animal
    {
        ……
        protected abstract string getShoutSound();
    }
            *注意:

                     第一,抽象類不能例項化
                                      比如動物例項沒有實際意義
                     第二,抽象方法必須是被子類重寫的方法
                                      不重寫的話,也沒有存在意義,看作沒有實現體的虛方法
                     第三,如果類中包含抽象方法,那麼類必須定義為抽象類,無論是否包含一些其它方法

       好了,我們想一下,竟然抽象類的抽象方法需要子類實現,那麼出現下面的這種情況的話就會出現問題了........

      

這樣的話要是在父類Animal定義抽象方法的話,猴,豬等都要去實現它,但是他們並沒有這種方法,因此引入介面。。

     2.介面.

              介面(interface)是把隱式公共方法和屬性組合起來,以封裝特定功能的一個集合。一旦類實現了介面,類就可以支援介面所指定的所有屬性和成員。宣告介面在語法上與               宣告抽象類完全相同,但不允許提供介面中任何成員的執行方式。
              一個類可以支援多個介面,多個類也可以支援同一個介面。       

    interface IChange
    {
        string ChangeThing(string thing);//不能有方法體和修辭符
    }
  例如:哆啦A夢類的實現:         

    class MachineCat:Cat, IChange//實現類和介面
    {
        public MachineCat() : base()
        {
        }

        public MachineCat(string name): base(name)
        {
        }

        public string ChangeThing(string thing)
        {
            return base.Shout() + " 我有萬能的口袋,我可變出" + thing;
        }
    }

3.抽象類和介面的區別:

抽象類可以給出一些成員的實現,介面卻不包含成員的實現,抽象類的抽象成員可被子類部分實現,介面的成員需要實現類完全實現,一個類只能繼承一個抽象類,但可實現多個介面等。
第一,類是物件的抽象,抽象類是對類的抽象;介面是對行為的抽象。
第二,如果行為跨越不同類的物件,可使用介面;對一些相似的類物件,用繼承抽象類。

第三,從設計的角度講,抽象類是從子類中發現了公共的東西,泛化出了父類,然後子類繼承父類,而介面是根本不知子類的存在,方法如何實現還不確認,是預先定義的


二.集合和泛型

1.集合:

 來用例子說明:

     

ArrayList實現了IList介面,所以可以用ArrayList的例項來賦值給IList(類似於多型),使用Arraylist裡面的方法


            IList AnimalList = new ArrayList();
            AnimalList.Add(new Cat("小花"));
            AnimalList.Add(new Dog("阿毛"));
            AnimalList.Add(new Cat("小黑"));
            AnimalList.Add(new Dog("嬌嬌"));
            AnimalList.Add(new Dog("咪咪"));
            AnimalList.Insert(1,new Cat("哆啦A夢"));

            foreach (Animal item in AnimalList)//這裡的AnimalList裡面的每一項都是Animal的子類,所以可以採用多型的形式來使用
            {
                MessageBox.Show(item.Shout());
            }        


2.泛型:

泛型是具有佔位符(型別引數)的類、結構、介面和方法,在IList和List後面加<T>,這個T就是集合資料的資料型別。

        private void button6_Click(object sender, EventArgs e)
        {
            IList<Animal> AnimalList = new List<Animal>();
            AnimalList.Add(new Cat("小花"));
            AnimalList.Add(new Dog("阿毛"));
            AnimalList.Add("Hello World");

            foreach (Animal item in AnimalList)
            {
                MessageBox.Show(item.Shout());
            }            
        }
這樣寫的話程式會報錯,因為"Helllo world"不是一個Animal的派生物件,需要這樣改進。。。

IList<Animal> AnimalList = new List<Animal>();
            AnimalList.Add(new Cat("小花"));
            AnimalList.Add(new Dog("阿毛"));
            AnimalList.Add("Hello World");

            foreach (Animal item in AnimalList)
            {
                MessageBox.Show(item.Shout());
            }            

這樣以來,"Helllo world"就是一個Animal的派生物件,可以對這個集合進行操作了。。。。。。

OK,整了兩個多小時,終於整理完了,期待下節課!!!!


相關文章