C# - 封裝性

  1. public 在新增 property 與 method 的時候,代表可以隨意查看、使用及修改。類型或成員可由相同元件中的任何其他程式碼或參考它的另一個元件來存取。
  2. private 在 c# 裡面代表只有自己可以查看、使用及修改
  3. proptery 被設為 private,能在同一個 class 的大括號範圍內使用。如果有變數或方法,只想在 class 裡面使用,就用 private 鎖在 class 裡面,限定只有 class 使用
1
2
3
4
5
class User
{
public string Username;//程式裡任何地方都可使用
private string Password;//只能在大括號內使用
}

如果在同一個 scope 裡面就可以隨意存取

1
2
3
4
5
6
7
8
9
10
class User
{
public string Username;//程式裡任何地方都可使用
private string Password;//只能在大括號內使用

public void reset()
{
Password = "";
}
}

Private 的常見用途

  • 情境一:密碼保護
    有些 Property 想要隱藏起來,不想讓 class 外的東西能夠隨意存取,例如密碼。
    此時如果有比對密碼的必要,就可以寫一個 public 的 method 間接存取
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class User
{
public string Username;
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 = "";
}
}
1
2
3
4
5
6
7
8
9
10
11
12
private void button1_Click(object sender, EventArgs e)
{
User user = new User("Tum","1234");
string result = "";
if (user.comparePassword("1234"))

result = "密碼正確";
else
result = "密碼錯誤";

MessageBox.Show(result);
}

Property 只想設成唯讀,就是只能看,不能夠修改

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class User
{
private string Username;//程式裡任何地方都可使用
private string Password;//只能在大括號內使用
public User(string Username, string Password)
{
this.Username = Username;
this.Password = Password;
}

public string getUsername()
{
return Username;
}

}
1
2
3
4
5
private void button1_Click(object sender, EventArgs e)
{
User user = new User("Tum","1234");
MessageBox.Show(user.getUsername());
}

property 的設定上增加一些限制

例如遊戲時要限定條件限制,血量不能變負數。設定一個 method 判斷 HP 不能等於負數。再用另一個 method 取得 private 的 HP 內容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
class User
{
private string Username;/
private string Password;
private int HP;
public User(string Username, string Password)
{
this.Username = Username;
this.Password = Password;
this.HP = 30;
}


public void hurt(int decreaseHP)
{
if(HP>=decreaseHP)
{
HP -= decreaseHP;
}
else
{
HP = 0;
}
}
public int getHP()
{
return HP;
}
}
1
2
3
4
5
6
7
8
private void button1_Click(object sender, EventArgs e)
{
User user = new User("Tum","1234");
user.hurt(10);
user.hurt(10);
user.hurt(10);

MessageBox.Show(""+user.getHP()); }

封裝性 encapsulated

  1. 隱藏物件內部的實作細節,不需要知道內部的運作方式。只提供介面以供使用。可以保護物件內的變數

緊密封裝 tightly encapsulated

把物件裡面所有變數設成 private,只提供 public method 供操作

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2020 CYC'S BLOG All Rights Reserved.

UV : | PV :