C# - 封裝:初學者指南

你好,未來的編程超級巨星!今天,我們將踏上一段令人興奮的旅程,進入 C# 的世界,並探索其基本概念之一:封裝。別擔心如果你之前從未寫過一行代碼——我在這裡將引導你走過每一步。那麼,我們來開始吧!

C# - Encapsulation

什麼是封裝?

在我們深入細節之前,讓我們先了解封裝是什麼。想像你有一個神奇的盒子,它能做很多驚人的事情,但你不需要知道它內部是如何工作的——你只需要知道如何使用它。這就是封裝的精髓!

在 C# 中,封裝是將數據(變量)和操作這些數據的方法打包在同一個單元或對象中。這就像在代碼周圍創造一個保護性的膠囊,因此得名為“封裝”。

現在,讓我們探索 C# 如何通過訪問修飾符來實現封裝。

C# 中的訪問修飾符

訪問修飾符是定義類、方法或屬性在代碼中可訪問性的關鍵字。把它們想像成不同的安全通行證。C# 提供了五個主要的訪問修飾符:

  1. Public
  2. Private
  3. Protected
  4. Internal
  5. Protected Internal

讓我們一一介紹它們。

Public 訪問修飾符

public 關鍵字就像一張“無限制通行”的通行證。當你將一個成員聲明為 public 時,它可以从程序的任何部分訪問。

public class Person
{
public string Name { get; set; }

public void SayHello()
{
Console.WriteLine($"Hello, my name is {Name}!");
}
}

class Program
{
static void Main(string[] args)
{
Person person = new Person();
person.Name = "Alice";  // 訪問 public 屬性
person.SayHello();  // 調用 public 方法
}
}

在這個例子中,NameSayHello() 都是 public 的,所以我們可以直接從 Main 方法訪問它們。

Private 訪問修飾符

現在,private 像一個“員工專用”區域。私有成員只能在同一個類中被訪問。

public class BankAccount
{
private double balance;

public void Deposit(double amount)
{
if (amount > 0)
{
balance += amount;
}
}

public double GetBalance()
{
return balance;
}
}

class Program
{
static void Main(string[] args)
{
BankAccount account = new BankAccount();
account.Deposit(100);
// account.balance = 1000000;  // 這將導致錯誤!
Console.WriteLine($"Balance: {account.GetBalance()}");
}
}

在這裡,balance 是私有的,所以我們不能直接從 BankAccount 類外部訪問它。我們需要使用像 Deposit()GetBalance() 這樣的 public 方法來與它交互。

Protected 訪問修飾符

protected 成員在同一個類和派生類中可訪問。這就像一個“家族專用”部分。

public class Animal
{
protected string name;

public Animal(string name)
{
this.name = name;
}

protected void Eat()
{
Console.WriteLine($"{name} is eating.");
}
}

public class Dog : Animal
{
public Dog(string name) : base(name) { }

public void Bark()
{
Console.WriteLine($"{name} is barking!");  // 可以訪問 protected 成員
Eat();  // 可以調用 protected 方法
}
}

class Program
{
static void Main(string[] args)
{
Dog dog = new Dog("Buddy");
dog.Bark();
// dog.name = "Max";  // 這將導致錯誤!
// dog.Eat();  // 這也將導致錯誤!
}
}

在這個例子中,Dog 可以訪問從其父類 Animal 繼承的 protected nameEat() 方法,但我們不能直接從 Main 方法訪問這些。

Internal 訪問修飾符

internal 成員在同一個程序集(可以將程序集想像為編譯的 .dll 或 .exe 檔案)內可訪問。這就像一個“公司員工專用”區域。

// 在 AssemblyOne.cs
internal class InternalClass
{
internal void InternalMethod()
{
Console.WriteLine("This is an internal method.");
}
}

// 在 Program.cs (同一個程序集)
class Program
{
static void Main(string[] args)
{
InternalClass obj = new InternalClass();
obj.InternalMethod();  // 這可以工作!
}
}

// 在不同的程序集中,這將不工作:
// InternalClass obj = new InternalClass();  // 錯誤!

Protected Internal 訪問修飾符

最後,protected internalprotectedinternal 的組合。它可以在同一個程序集內或由其他程序集中的派生類訪問。

// 在 AssemblyOne.cs
public class BaseClass
{
protected internal void ProtectedInternalMethod()
{
Console.WriteLine("This is a protected internal method.");
}
}

// 在 AssemblyTwo.cs
public class DerivedClass : BaseClass
{
public void CallProtectedInternalMethod()
{
ProtectedInternalMethod();  // 這可以工作!
}
}

// 在 Program.cs (AssemblyTwo)
class Program
{
static void Main(string[] args)
{
DerivedClass obj = new DerivedClass();
obj.CallProtectedInternalMethod();
// obj.ProtectedInternalMethod();  // 這將不工作!
}
}

訪問修飾符總結

這裡有一個方便的表格總結訪問級別:

訪問修飾符 同一類 派生類(同一程序集) 非派生類(同一程序集) 派生類(不同程序集) 非派生類(不同程序集)
Public
Private
Protected
Internal
Protected Internal

這就是全部了!你剛剛踏出了進入 C# 中封裝世界的第一步。記住,封裝是關於控制對你的代碼和數據的訪問。它幫助你撰寫更安全、可維護和靈活的程序。

隨著你編程旅程的繼續,你會發現封裝變得習以為常。這就像學習騎自行車——起初有點晃動,但很快你就能毫不猶豫地馳騁!

持續練習,保持好奇心,並且快樂編程!

Credits: Image by storyset