2015年11月6日 星期五

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;
        }
    }


執行結果:













沒有留言:

張貼留言