iT邦幫忙

0

【C#學習筆記】07《類別(Class)》

  • 分享至 

  • xImage
  •  

在 C# 中,類別(Class)物件導向程式設計(OOP,Object-Oriented Programming)的核心概念之一。
可以把類別想成是一種「藍圖(Blueprint)」、「模板(Template)」或「設計圖」。而根據類別建立出來的實際物件,稱為物件(Object)實體(Instance)


【C#學習筆記】06《字串與字元》


類別的組成

(一)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#類別與物件的基礎關係完整紀錄下來,將抽象的物件導向觀念落實到程式碼中。筆記中涵蓋了儲存資料的欄位與屬性、定義行為的方法,以及負責初始化的建構子,解釋整個類別架構的組成。
關於類別,還有很多東西需要學習,會在後續的筆記中持續記錄!


圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言