C#之小練⑨(Directory保存歌曲名字、多態練習、抽象方法、接口)

①、將文件夾中的音樂名稱複製到一個文本文檔中

 static void Main(string[] args)
        {
            string path = @"C:\Users\Smile\Desktop\MUSIC";      //創建一個文件夾路徑
            string pathtext = @"C:\Users\Smile\Desktop\1.txt";  //創建一個文本文檔路徑
            string[] str=Directory.GetFiles(path);              //獲取文件夾路徑下面的除文件夾之外的所有文檔
            List<string> musics = new List<string>();           //創建歌曲名稱的存放泛集合
            for (int i = 0; i < str.Length ; i++)               //遍歷文件夾下獲取的所有文件名稱路徑
            {
                                                                //方法一:將文件名路徑進行切割
                string[] splitstr=str[i].Split(new char[] { '\\' }, StringSplitOptions.RemoveEmptyEntries);
                musics.Add(splitstr[splitstr.Length - 1]);      //將切割出來的最後的一個內容添加到泛集合musics變量中
                                                                //方法二:獲取最後\的索引值,然後讀取\後面的內容
                int index=str[i].LastIndexOf("\\");
                musics.Add(str[i].Substring(index + 1));
            }
            File.WriteAllLines(pathtext, musics);               //調用File按行寫入的方法,將內容寫入控制檯
        }

②、多態代碼

 //當子類方法與父類方法具有相同方法名稱時,運行沒有問題,但子類的方法名會報綠線,那如何解決這個綠線?
 //方法一:(不推薦使用)在子類方法中添加new 關鍵字,無論是否加new都不影響使用.new隱藏基類當中的方法
 //方法二:(推薦使用)在子類方法中添加override 重寫父類方法,父類方法修飾符後面需加virtual關鍵字,方法不能用Static修飾,不能用private,原因:爲了讓子類訪問,不能爲私有
 //爲什麼不能使用static,因爲用了static只能用類來調取方法,即類.方法名,這樣子類就無法調取父類的方法
 //方法二是把父類的方法進行了重寫,創新,已經是子方法特有的方法了。父類方法依然存在,可以調取
 //爲什麼直接把子類中的方法名稱改掉而要重寫呢?爲了調取時方便,只調取一個方法名。
 //多態就是對象可以表現多個類型的能力
     class Program
    {
        static void Main(string[] args)
        {
                                                                //隨機產生10個類的對象
            Animal[] animals = new Animal[10];                  //實例化是一個類數組,即建立一個類數組
            Random rnd = new Random();                          //實例化一個隨機數
          
            for (int i = 0; i < animals.Length; i++)            //遍歷類數組
            {
                int num = rnd.Next(1, 5);                       //創建一個1-4的隨機數
                switch(num)                                     //將num轉換到以下不同的case中
                {
                    case 1:animals[i] = new Pig("趙");break;     //如果num=1,實例化類組合中的類
                    case 2:animals[i] = new Dog("錢");break;     //如果num=2,實例化類組合中的類
                    case 3:animals[i] = new Cat("孫");break;     //如果num=3,實例化類組合中的類
                    case 4:animals[i] = new Cow("李");break;     //如果num=4,實例化類組合中的類
                }
            }
            for (int i = 0; i < animals .Length ; i++)          //遍歷已經實例化完的類數組
            {
                animals[i].Shout();                             //調取每個數組中實例化類,即對象的方法
            }
            Console.ReadKey();
        }

    }
    public abstract  class Animal                               //創建一個抽象類Animal
    {
        public Animal(string name)                              //創建抽象類Animal的構造函數
        {
            this._name = name;
        }
        string _name;                    
        public string Name                                                             
        {
            get { return _name; }
            set { _name = value; }
        }


        public abstract void Shout();                           //創建抽象方法,動物叫,叫是一個動作,因每個動物叫的聲音不一樣,所以這裏定義爲抽象方法,具體的聲音讓子類實現

    }
    public class Pig:Animal                                     //創建一個Pig類繼承抽象類Animal
    {   public Pig(string name):base(name)                      //創建一個Pig的構造函數,name的參數從基類中獲得
        {

        }
        public override void Shout()                            //子類通過override 關鍵字來重寫父類中的抽象方法
        {
            Console.WriteLine("{0},哼哼",this.Name);
        }
    }

③、抽象代碼

//抽象方法用abstract修飾
 //抽象方法裏面沒有方法體
 //抽象方法,抽象成員必須在抽象類中
 //抽象類有非抽象成員,非抽象方法
 //抽象類無法實例化,抽象方法無法調取
 //父類是抽象類,子類繼承了這個類,必須把抽象類中的方法進行重寫,否則會報錯,必須要override,抽象類的派生類(子類)必須實現抽象方法體
 //抽象類只能用於基類,無法實例化
 //抽象方法只有子類可以重寫,所以子類中一般不寫抽象類

    class Program
    {
        static void Main(string[] args)
        {
            Pig pig = new Pig();     //實例化一個Pig類
            pig.Shout();             //調取對象pig的Shout方法
            Console.ReadKey();
        }
    }
    public abstract class Animal
    {
        public Animal(string name)
        {
            this._name = name;
        }
        public Animal()
        {
        }
        string _name;                                         
        public string Name                                     
        {
            get { return _name; }
            set { _name = value; }
        }

        public abstract void Shout();   //抽象方法沒有方法體
    }

    public class Pig:Animal            //子類Pig繼承父類Animal
    {
        public override void Shout()   //子類用override關鍵字重寫了父類Shout方法
        {
            Console.WriteLine("哼哼叫");
        }
    }

④、接口代碼

 interface IFly  
    {
        void IFly();
    }
    class Program
    {
        static void Main(string[] args)
        {
            Animal animal = new Animal("喬巴");                  //實例化一個Animal類,即創建一個animal對象
            animal.IFly();                                      //調用對象animal的IFly()方法
            Console.ReadKey();
        }
    }
    public  class Animal:IFly                                   //創建一個Animal類實現IFly接口
    {
        public void IFly()                                      //子類要實現方法就要有具體的方法體
        {
            Console.WriteLine("我會飛");
        }
        public Animal(string name)                              //創建抽象類Animal的構造函數
        {
            this._name = name;
        }
        string _name;
        public string Name
        {
            get { return _name; }
            set { _name = value; }
        }
    }

  終於完成核心代碼的練習,下一站走起^_^

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章