顯示具有 C#基本概念 標籤的文章。 顯示所有文章
顯示具有 C#基本概念 標籤的文章。 顯示所有文章

2015年11月6日 星期五

C# - 覆寫(Override)

學習重點:
  • 經由覆寫可以更改繼承到的方法
  • 可以使用Base Class的變數來存取繼承class的物件
  • 被override的方法須加上virtual
  • override的方法其名稱與參數型別都要跟被override的相同

主程式  : 
        private void button1_Click(object sender, EventArgs e)
        {
            Player p = new Player("勇者");
            Monster m = new Monster("史萊姆");
            Villager v = new Villager("村民");

            Creature c = m;
           
            string message1 = v.attack(m);
            string message2 = c.move(); //能以Creature的身份呼叫Monster的方法

            MessageBox.Show(message1 + "\n" + message2);

        }

Creature 類別  :
    class Creature
    {
        public string name;

        public virtual string move() //加了virtual的方法才可被覆寫
        {
            return name + "向前走";
        }
       
        public virtual string attack(Creature target) //加了virtual的方法才可被覆寫
        {
            return name + "攻擊了" + target.name;
        }

    }


Player 類別  :
    class Player : Creature
    {
        public Player(string name)
        {
            this.name = name;
        }

    }


Monster 類別  :
    class Monster : Creature
    {
        public Monster(string name)
        {
            this.name = name;
        }

        public override string move()
        {
            return name + "橫著走";
        }

    }

Villager 類別  :
    class Villager : Creature
    {
        public Villager(string name)
        {
            this.name = name;
        }

        public override string attack(Creature target) // 覆寫基底類別的此方法
        {
            return name + "不能攻擊其他人";
        }

    }


執行結果:













C# - 亂數(Random)

學習重點:
  • C#內建一個Random的類別,可使用Next()方法產生亂數

主程式  : 
        private void button1_Click(object sender, EventArgs e)
        {
            Random random = new Random();

            int injured1 = random.Next() % 100; //寫法1: 0~99
            int injured2 = random.Next(100);    //寫法2: 0~99
            int injured3 = random.Next(0,100);  //寫法3: 0~99

            MessageBox.Show("受到的傷害分別為:" + "\n" + injured1 + "\n" + injured2 + "\n" + injured3);

        }


執行結果:












C# - 繼承性(Inheritance)

學習重點:
  • 繼承性的好處 - 減少程式碼的重複性(包含class內部),讓程式碼易於維護

主程式  : 
        private void button1_Click(object sender, EventArgs e)
        {
            Village vi1 = new Village();
            Monster mon1 = new Monster();
            Monster mon2 = new Monster();

            mon1.Attack(vi1);
            mon1.Attack(mon2);
            mon1.Attack(mon2);

            MessageBox.Show("怪物1 HP:" + mon1.GetHP() + "\n" +
                            "怪物2 HP:" + mon2.GetHP() + "\n" +
                            "村民1 HP:" + vi1.GetHP() + "\n");

        }

Creature 類別  :
    class Creature // 基底類別/父類別 (Base Class)
    {
        private int hp = 100;

        public int GetHP()
        {
            return hp;
        }

        public void Injured(int injuredPoint)
        {
            hp -= injuredPoint;
        }

    }

Monster 類別  :
    class Monster : Creature // 衍生類別/子類別(Derived Class) 繼承Creature的屬性與方法
    {
        public void Attack(Creature c) // 不用重複寫多個不同的Attack(XXX)方法
        {
            c.Injured(10);
        }
    }

Village 類別  :
    class Village : Creature // 衍生類別/子類別(Derived Class) 繼承Creature的屬性與方法
    {
        public string Talk()
        {
            return "呵呵";
        }

    }

執行結果:














C# - 封裝性(Encapsulation)

學習重點:
  • 封裝性 - 隱藏內部的實作細節,只提供介面供大家使用
  • 緊密(tightly)封裝 - 把物件中所有的變數設成private,只提供public方法供操作
  • 封裝性的好處 - 可保護物件內的變數,使用者只要會用就好
  • public - 任何人可以隨意觀看,使用或修改的事物
  • private - 只有自己可以觀看,使用或修改的事物 (通常用於宣告不想被修改的屬性)
  • 利用 private 宣告該類別的屬性或方法,則只在該類別內有權限操作此屬性或方法
  • get的程式碼會在嘗試取得變數內容時呼叫
  • set的程式碼會在嘗試存入數值時呼叫
  • get與set存取器可以讓一些計算用變數的方式呈現
  • 為了防止一些意外操作可將變數設為private,並且利用method當作中介,或是利用get與set

主程式  : 
        private void button1_Click(object sender, EventArgs e)
        {
            User s = new User("小王","123",100);

            string result = "";

            if (s.ComparePassWord(text_password.Text)) result = "密碼正確";
            else result = "密碼錯誤";

            s.HP = 80;

            MessageBox.Show("帳號名稱:" + s.GetName() + "-" + result+"\n"
                            +"HP:"+ s.HP + "\n"
                            + "Money:" + s.Money);
        }

User 類別  :
    class User
    {
        private string Name;
        private string Password;
        private int hp;
        private int coin1, coin5, coin10;

        public int Money
        {
            get { return coin1 * 1 + coin5 * 5 + coin10 * 10; }
        }

        public int HP
        {
            get { return hp; } //在讀取HP時自動呼叫
            set //在存入數值時自動呼叫
            {
                if (value < 0) HP = 0;
                else hp = value;
            }
        }

        public void hurt(int decreaseHP)
        {
            if (hp >= decreaseHP) hp -= decreaseHP;
            else hp = 0;
        }

        public int GetHP()
        {
            return hp;
        }

        public User(string Name, string Password, int HP)
        {
            this.Name = Name;
            this.Password = Password;
            this.hp = HP;
            this.coin1 = 1;
            this.coin5 = 1;
            this.coin10 = 1;
        }

        public bool ComparePassWord(string password)
        {
            if(this.Password == password) return true;
            else return false;
        }

        public string GetName()
        {
            return Name;
        }
    }


執行結果: