在 C# 中,類別(Class)是物件導向程式設計(OOP,Object-Oriented Programming)的核心概念之一。
可以把類別想成是一種「藍圖(Blueprint)」、「模板(Template)」或「設計圖」。而根據類別建立出來的實際物件,稱為物件(Object)或實體(Instance)。
(一)Field(欄位)欄位(Field)通常用來儲存資料,屬於資料成員(Data Member)。
存取修飾詞 資料型別 變數名稱;
private string name;
(二)Property(屬性)屬性(Property)提供安全的存取方式,本質上也是欄位的一種,也是屬於資料成員(Data Member)。
//get取得資料
//set修改資料
public string Food { get; set; }
關於get/set,後續章節會有更詳細的解釋。
(三)Method(方法)方法(Method)主要用來定義物件的行為,描述物件可以做的事情,例如:玩家可以移動、敵人可以攻擊等,屬於方法成員(Method Member)的一部份。
public void Skill(string skill_name) // 傳入參數
{
Console.WriteLine($"{skill_name} is used");
}
(四)Constructor(建構子)建構子(Constructor)主要用來初始化物件及設定初始值,使建立物件時自動執行,也可以屬於方法成員(Method Member)的一部份。
public class Player
{
// Constructor(建構子)- 建立 Player 時自動執行
// 建立Player時自動執行
public Player(string name, int hp, int attack)
{
Name = name;
HP = hp;
Attack = attack;
Console.WriteLine("Player Created!");
}
}
建構子鏈結(Constructor Chaining)
建構子鏈結是指一個建構子去呼叫另一個建構子。假設遊戲角色有很多初始化方式,如果每個建構子都自己寫初始化:
public Player()
{
Name = "Knight";
HP = 100;
}
public Player(string name)
{
Name = name;
HP = 100;
}
public Player(string name, int hp)
{
Name = name;
HP = hp;
}
會導致重複程式碼,造成維護困難及容易漏改,所以會使用建構子鏈結。
public class Player
{
public string Name { get; set; }
public int HP { get; set; }
public int Attack { get; set; }
// 最終初始化建構子
public Player(string name, int hp, int attack)
{
Name = name;
HP = hp;
Attack = attack;
Console.WriteLine("Player Created!");
}
// 呼叫上面的建構子
public Player(string name) : this(name, 100, 10)
{
}
// 呼叫上面的建構子
public Player() : this("Knight", 100, 10)
{
}
}
假設今天要建立遊戲中的角色資料,我們需要的資料有名稱、血量及攻擊力,此外,每個角色都具有移動與攻擊的功能,所以可以提供方法成員供外部呼叫。由於每個角色創建出來所需要的資料與功能相同,因此,可以為角色建立一個共同的類別(class),方便後續統一及擴充。
public class Player
{
// Field(欄位)- 通常不希望外部直接修改
private string PlayerID; // 玩家 ID
// Property(屬性)
private string Name { get; set; } // 玩家名稱
private int HP { get; set; } // 玩家血量
private int Attack { get; set; } // 玩家攻擊力
// Constructor(建構子)- 建立 Player 時自動執行
public Player(string playerID, string name, int hp, int attack)
{
PlayerID = playerID;
Name = name;
HP = hp;
Attack = attack;
Console.WriteLine($"Player Created! ID: {PlayerID}, Name: {Name}, HP: {HP}, Attack: {Attack}");
}
public Player(string id, string name) : this(id, name, 100, 10) // 使用建構子鏈結,預設 HP 為 100,攻擊力為 10
{
//Console.WriteLine($"Player Created with default HP and Attack! Name: {Name}, HP: {HP}, Attack: {Attack}");
}
// Method(方法)
public void Move() // 玩家移動
{
Console.WriteLine($"{Name} is moving.");
}
public void AttackEnemy() // 玩家攻擊
{
Console.WriteLine($"{Name} attacks enemy!");
}
}
建構完類別之後,可以在外部去使用。
// 這裡的 player1 與 player2 就是根據 Player 類別(藍圖)所建立出來的「物件」或「實體」
Player player1 = new Player("1", "Alice", 5000, 200);
Player player2 = new Player("2", "Bob");
// 透過實體來呼叫類別中定義的方法
player1.Move();
關於類別的可視範圍,歡迎參考先前的筆記。
【C++學習筆記】03《你的變數不是你的變數》
這次透過遊戲角色的情境,把C#類別與物件的基礎關係完整紀錄下來,將抽象的物件導向觀念落實到程式碼中。筆記中涵蓋了儲存資料的欄位與屬性、定義行為的方法,以及負責初始化的建構子,解釋整個類別架構的組成。
關於類別,還有很多東西需要學習,會在後續的筆記中持續記錄!