C#_封裝性 Public vs Private_private用途_可遠觀而不可褻玩焉



public : 任何人可以任意觀看、使用以及修改的事物


private : 只有自己才能夠觀看、使用以及修改的事物



平常你可能會偷存一點私房錢

你希望這筆錢的數目和使用都只有自己使用

是一個  private~~~~

或者在上   fb 、  twitter之類

都可申請帳號    然後都有密碼

只有自己才可登入


password   你也不希望 任何人都可觀看修改和使用


也是一個  private~~~~~


這裡我們新建一個新的   class

叫做   User

======================================================================



當我建好物件
要引用的時候  會有找不到passWord屬性的情形

就是因為設置成  private了

若應用
會出現
passWord的保護層級會導致無法對其進行存取的錯誤


為捨麼要設置成private???


情境 1.不能給他人看到以及修改



我們在寫一些  跟銀行帳號有關的 class

我們就需要 設置成private不然會有危險

不然就會有危險!!!!




如果要比對密碼的時候


我們可能就會需要再多寫一個  public method  來做比對










情境 2.有些property只想讓別人看到但是不能讓他人修改
(唯讀)


像是帳號  通常聲請完就固定了


通常 只能看  不能修改


我們把   username 設置成  private 看看

所以現在無法在外(其他區塊)對它進行修改了


我們現在要做的就是帳號讓人無法修改但是可以看的到

無法讓人修改  就將 property 改成 private

至於 秀出來就寫一個  public method 去秀即可!!!!




主程式碼  Program.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace class_exercise
{
    class Program
    {
        static void Main(string[] args)
        {
            User user = new User("kuanyu","1234");
            //user.userName = "Kuanyu";
            //user.passWord = "123";
            string result = "";

            if (user.comparePassword("123"))
                result = "password 正確";
            else
                result = "password 錯誤";

            Console.WriteLine(result);

            Console.WriteLine(user.getUserName());


            //會出現錯誤
            //passWord的保護層級會導致無法對其進行存取

            Console.ReadKey();
        }
    }
}



Class程式碼  User.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace class_exercise
{
    class User
    {
        //public string userName;
        private string userName; // 改成private不讓他人改
        private string passWord;//不讓人修改它

        public User(string userName, string passWord)
        {
            this.userName = userName;
            this.passWord = passWord;
        }

        public bool comparePassword(string targetPassword)
        {
            if (this.passWord == targetPassword)
                return true;
            else
                return false;
        }

        //可能會有人忘記密碼或是輸入錯誤!!!
        private void reset()
        {
            passWord = "";
        }
        //搜尋結果
        //「可遠觀而不可褻玩焉」
        public string getUserName()
        {
            return userName;
        }

    }
}



這就是「唯讀」 只能看不能做修改

我們就把  屬性   設為  private  再寫一個public method  就可以了
=====================================================================

情境 3. 想在某些property 的 設定上增加一些限制

線上遊戲 or 手遊 中的玩家這個class(物件)有 HP這個屬性


public int  hp;


今天在程式某區塊遇到怪物攻擊而削減了

此時有可能把  user 的 hp屬性 設為  -10  (小於0了)

當然一般我們不可能會設為  負數

我們一定都會把它設為   大於等於0的數值

user.hp = -10
user.hp   -= 10 ;

一般遊戲的設計通常是要求程式「減少特定數值」(可能是怪物的攻擊力)

「直接設定數值」的情況就較少見
=======================================================
你會說我們只要加上判斷  >=0 就可以啦

if(  user.hp  >= 10 )
     user.hp   -= 10 ;

先判斷   hp  有沒有變成負數再做削減生命值的設定


如果我們假設一隻怪物是一個class

它在攻擊時要做此判斷!!!

如果今天寫了不只一種怪物的class的話呢???


那每個都要做此判斷!!!

這就會寫好多重複的程式 又可能會忘記寫

hp  就可能變成  負數


=======================================================

因此    比較  合理的作法是在  user  這個類別去做判斷~~~


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

因此在其他地方就只需要寫   user.hurt(10);  之類的

注意   hp  要改設為  private  了
private int  hp;

所以若想修改hp的值只能夠透過  hurt ()  的  method 喔!!!


主程式執行後  生命值削減了




主程式碼  Program.cs


using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace class_exercise
{
    class User
    {
        //public string userName;
        private string userName; // 改成private不讓他人改
        private string passWord;//不讓人修改它

        private int hp; // 生命值

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


        public User(string userName, string passWord)
        {
            this.userName = userName;
            this.passWord = passWord;

            this.hp = 20 ;
        }

        public bool comparePassword(string targetPassword)
        {
            if (this.passWord == targetPassword)
                return true;
            else
                return false;
        }

        //可能會有人忘記密碼或是輸入錯誤!!!
        private void reset()
        {
            passWord = "";
        }
        //搜尋結果
        //「可遠觀而不可褻玩焉
        public string getUserName()
        {
            return userName;
        }

    }
}



Class程式碼  User.cs




using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace class_exercise
{
    class User
    {
        //public string userName;
        private string userName; // 改成private不讓他人改
        private string passWord;//不讓人修改它

        private int hp; // 生命值

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


        public User(string userName, string passWord)
        {
            this.userName = userName;
            this.passWord = passWord;

            this.hp = 20 ;  // 生命值初始化!!!
        }

        public bool comparePassword(string targetPassword)
        {
            if (this.passWord == targetPassword)
                return true;
            else
                return false;
        }

        //可能會有人忘記密碼或是輸入錯誤!!!
        private void reset()
        {
            passWord = "";
        }
        //搜尋結果
        //「可遠觀而不可褻玩焉
        public string getUserName()
        {
            return userName;
        }

    }
}

留言

這個網誌中的熱門文章

何謂淨重(Net Weight)、皮重(Tare Weight)與毛重(Gross Weight)

Architecture(架構) 和 Framework(框架) 有何不同?_軟體設計前的事前規劃的藍圖概念

經得起原始碼資安弱點掃描的程式設計習慣培養(五)_Missing HSTS Header