天天看點

自己從0開始學習Unity的筆記 VII (C#中類繼承練習)

好久都沒有寫了。今天做了類繼承的練習,做了一個小隊,進行簡單的判定。

namespace 兵團建立練習
{
    class ServantBasics
    {
        public string name;     //protected 代表着子類可以繼承,外部不能調用
        protected int attack;

        public ServantBasics(string name,int attack)   //做了一個構造函數,用于指派
        {
            this.name = name;                                      
            this.attack = attack;
        }
    }

    class SaberServant : ServantBasics   //用于繼承父類函數 這個就是文法
    {
        public SaberServant(string name, int attack) : base(name, attack) //這個其實是上面輸入父類後,然後有個紅線自動點選會自動填入,不過我也認真記了一下,和this用法挺像的
        {
        }
        
        public void skill()
        {
            Console.WriteLine("“EX咖喱棒!!!”");
            Console.WriteLine("給對面造成了{0}點傷害",attack);

        }
    }

    class ArcherServant: ServantBasics   //用于繼承父類函數 
    {
        public ArcherServant(string name,int attack) : base(name,attack)
        {
        }

        public void skill()
        {
            Console.WriteLine("“無限劍制”");
            Console.WriteLine("給對面造成了{0}點傷害", attack);
        }
    }
    class RiderServant : ServantBasics    //用于繼承父類函數
    {
        public RiderServant(string name, int attack) : base(name, attack)
        {
        }

        public void skill()
        {
            Console.WriteLine("“無限劍制”");
            Console.WriteLine("給對面造成了{0}點傷害", attack);
        }
    }
    class CasterServant : ServantBasics     //用于繼承父類函數
    {
        public CasterServant(string name, int attack) : base(name, attack)
        {
        }

        public void skill()
        {
            Console.WriteLine("“萬符必應破戒”");
            Console.WriteLine("給對面造成了{0}點傷害", attack);
        }
    }


    class Program
    {
        static void Main(string[] args)
        {
            var r = new Random();    //建立一個随機的骰子
            var servantParty = new ServantBasics[10];   //建立了一個10個人小隊的數組
            for (int i = 0; i < servantParty.Length; i++)
            {
                var roll = r.Next(1, 101);
                if (roll > 70)
                {
                    servantParty[i] = new SaberServant("劍士",100);
                }
                else if (roll > 40)
                {
                    servantParty[i] = new ArcherServant("弓箭手", 90);
                }
                else
                {
                    servantParty[i] = new CasterServant("魔法師", 110);
                }
            }

            for (int i = 0; i < servantParty.Length; i++)
            {
                if (servantParty[i] is SaberServant)         //我是這樣了解的,用父類建立的這個子類,是不是SaberSevrvant
                {
                    SaberServant saber = servantParty[i] as SaberServant; //如果不是傳回空,如果是就給saber指派
                    Console.WriteLine("這是第{0}個,職業是{1}",i+1,saber.name);
                    saber.skill();
                }
                else if (servantParty[i] is ArcherServant)
                {
                    Console.WriteLine("這是第{0}個,職業是{1}", i + 1, (servantParty[i] as ArcherServant).name);
                    (servantParty[i] as ArcherServant).skill();      //嘗試進行簡寫
                }
                else
                {
                    Console.WriteLine("這是第{0}個,職業是{1}", i + 1, (servantParty[i] as CasterServant).name);
                    (servantParty[i] as CasterServant).skill(); 
                    //我自己測試發現不能直接用servantParty[i].skill,沒有選項,因為這個數組是基于父類建立的
                    //這種方法被稱為裡氏轉換,挺神奇的,因為我以為數組都存好了資料new後的資料,居然不能 .skill
                }
            }

            Console.ReadKey();

        }
    }
}      

用了一個數組來記錄東西,我覺得這樣似乎可以做生成地圖随機怪獸的玩意,是以記錄下來,友善以後忘記時候來看看,可能會有幫助