C# - 封裝:初學者指南
你好,未來的編程超級巨星!今天,我們將踏上一段令人興奮的旅程,進入 C# 的世界,並探索其基本概念之一:封裝。別擔心如果你之前從未寫過一行代碼——我在這裡將引導你走過每一步。那麼,我們來開始吧!
什麼是封裝?
在我們深入細節之前,讓我們先了解封裝是什麼。想像你有一個神奇的盒子,它能做很多驚人的事情,但你不需要知道它內部是如何工作的——你只需要知道如何使用它。這就是封裝的精髓!
在 C# 中,封裝是將數據(變量)和操作這些數據的方法打包在同一個單元或對象中。這就像在代碼周圍創造一個保護性的膠囊,因此得名為“封裝”。
現在,讓我們探索 C# 如何通過訪問修飾符來實現封裝。
C# 中的訪問修飾符
訪問修飾符是定義類、方法或屬性在代碼中可訪問性的關鍵字。把它們想像成不同的安全通行證。C# 提供了五個主要的訪問修飾符:
- Public
- Private
- Protected
- Internal
- 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 方法
}
}
在這個例子中,Name
和 SayHello()
都是 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 name
和 Eat()
方法,但我們不能直接從 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 internal
是 protected
和 internal
的組合。它可以在同一個程序集內或由其他程序集中的派生類訪問。
// 在 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