第十四式:C# 封装 (闭门造车)

绝世
秘籍
冲儿,各门各派都有自己的独门秘籍,是不轻易示人的。
把重要的数据隐藏起来,只对外提供有限的接口,这就叫封装 (Encapsulation)
就像紫霞神功的秘籍,只有掌门人能看,普通弟子看不得?
不错!若是谁都能随便改动门派的机密(变量),那还不天下大乱?

1. 访问修饰符 (Access Modifiers) - 门派禁令

C# 用几个关键词来控制谁能看,谁不能看。

修饰符 权限范围 江湖比喻
public 公开 广而告之,天下人皆可访问。
private 私有 绝密,只有本门派(本类)内部可以访问。默认就是这个。
protected 受保护 传家宝,只有本门派和分舵(子类)可以访问。
internal 内部 同盟会,同一个程序集(项目)内可以访问。

2. 实践:保护内力

我们不想让外人直接修改我们的内力值,只能通过特定的方法(练功/受伤)来改变。


class Swordsman
{
    // 私有变量:外人看不见,改不了
    private int internalEnergy = 100;

    // 公开方法:外人可以调用
    public void Attack()
    {
        Console.WriteLine("哈!看剑!");
        // 内部可以随心所欲地修改私有变量
        internalEnergy -= 10; 
    }

    // 公开方法:展示内力
    public void ShowEnergy()
    {
        Console.WriteLine("当前内力:" + internalEnergy);
    }
}
        
封装的好处在于安全简单
外人不需要知道你的内力是怎么流转的(实现细节),只需要知道怎么叫你打架(调用公开方法)就行了。这叫“黑盒子”原理。
🔒

动手时刻:藏宝箱

创建一个 TreasureBox 类:

  1. 包含一个私有的 gold 变量。
  2. 提供一个公开的 AddGold(int amount) 方法来存钱。
  3. 提供一个公开的 GetGold() 方法来查看余额。
  4. 挑战: 尝试在 Main 方法里直接访问 gold,看看编译器会说什么?
查看参考答案

class TreasureBox
{
    private int gold = 0;

    public void AddGold(int amount)
    {
        gold += amount;
    }

    public int GetGold()
    {
        return gold;
    }
}

// 在 Main 中:
// box.gold = 100; // 报错!'TreasureBox.gold' is inaccessible due to its protection level
                    

成就解锁:【守密人】 获得:紫霞神功秘籍(封印版)