iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 4
0
Modern Web

征服C#系列 第 15

Day15 物件導向封裝性-Get & Set 存取器

  • 分享至 

  • xImage
  •  

今天來學習一下Get & Set 存取器用法

1.Get & Set 存取器的語法如下:

......... // 宣告變數(通常是 public)
{

get { .... } // 希望變數讀取時執行的程式碼
set { .... } // 希望數值存入時執行的程式碼

}

2. 如果只使用 get 而沒有 set 的話,該變數將會變為唯讀

3. 使用 Get & Set 存取器時,並不一定要有對應的 private 變數

4. Get & Set 存取器可以用來即時運算一些平常大家認為是變數的數值,像是 Money

Class User
https://ithelp.ithome.com.tw/upload/images/20191002/20119848YFQTDZ23qM.png
主程式
https://ithelp.ithome.com.tw/upload/images/20191002/20119848UUDP8Xd7OP.png
結果
https://ithelp.ithome.com.tw/upload/images/20191002/20119848IOi2L0XG2q.png
主程式
https://ithelp.ithome.com.tw/upload/images/20191002/20119848XKBL9vjDi0.png
結果
https://ithelp.ithome.com.tw/upload/images/20191002/2011984822dgZMnpyA.png

Class User
https://ithelp.ithome.com.tw/upload/images/20191002/20119848Sf74QRLtHP.png
主程式
https://ithelp.ithome.com.tw/upload/images/20191002/20119848avU159lLNO.png
結果
https://ithelp.ithome.com.tw/upload/images/20191002/201198488vmJzXqbbm.png
假設只有get沒有set那麼HP就會變成唯讀不能進行存入的動作
https://ithelp.ithome.com.tw/upload/images/20191002/20119848mtAxuX2Lpg.png

結語:這次的get、set存取器花了一些時間來理解,如果有誤請告知小弟我會趕快修正的

練習題:

你現在是一位遊戲公司的設計師,這次受命完成玩家類別的部分程式碼
其中必須要完成以下兩項工作:

  1. 撰寫計算玩家身上物品總值(TotalValue) 的程式碼
  2. 撰寫讓外部物件存取飢餓度(HungerRate) 的程式碼
    注意:飢餓度必須介於 0~100 之間,所以要想辦法防止外人存取時超出範圍

以下是玩家的部分程式碼:

class Player
    {
        //目標 1.欠缺計算總值的程式碼(TotalValue)2.欠缺存取飢餓度(HungerRate) 的程式碼
        //property
        private int CountGold; // 擁有的金子數目,每個金子值 50
        private int CountSilver; // 擁有的銀子數目,每個銀子值 25
        private int CountCopper; // 擁有的銅的數目,每個銅值 10


        private int TotalValue;
        public int totalValue
        {
            get
            {
                TotalValue = 50 * CountGold + 25 * CountSilver + 10 *CountCopper;
                return TotalValue;
            }
        }
        //get 、set
        private int HungerRate; // 飢餓度,必須介於 0~100 之間
        public int hungerRate
        {
            get { return HungerRate; }
            set
            {
                if (value >= 100)
                    HungerRate = 100;
                else if (value <= 0)
                    HungerRate = 0;
                else
                    HungerRate = value;
            }
        }
        //constructor
        public Player()
        {
            this.CountGold = 0;
            this.CountSilver = 0;
            this.CountCopper = 0;
            this.HungerRate = 80;
        }

        public void PickAGold()
        {
            CountGold++;
        }

        public void PickASilver()
        {
            CountSilver++;
        }

        public void PickACopper()
        {
            CountCopper++;
        }
    }
 private void Button1_Click(object sender, EventArgs e)
        {
            Player player = new Player();

            player.PickAGold();
            player.hungerRate += 10; // 餓了,飢餓度上升

            player.PickASilver();
            player.hungerRate += 10; // 餓了,飢餓度上升

            player.PickASilver();
            player.hungerRate += 10; // 餓了,飢餓度上升

            MessageBox.Show("飢餓度:" + player.hungerRate + ",身上物品總值:" + player.totalValue);

            player.PickACopper();
            player.hungerRate -= 60; // 吃了一個可以減少 60 飢餓度的東西

            player.PickAGold();
            player.hungerRate -= 60; // 吃了一個可以減少 60 飢餓度的東西

            MessageBox.Show("飢餓度:" + player.hungerRate + ",身上物品總值:" + player.totalValue);

        }

當你按下按鈕執行後,應該要得到兩個對話框如下:
https://ithelp.ithome.com.tw/upload/images/20191002/20119848dRpomp6auI.png
https://ithelp.ithome.com.tw/upload/images/20191002/20119848Sj9WebKsCV.png


上一篇
Day14 物件導向封裝性-Private的三種常見方法
下一篇
Day16 物件導向封裝性-所以到底甚麼是封裝性?
系列文
征服C#21
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言