程序设计基础
登录

知识介绍

封装 = 把数据藏起来(private),只通过公共方法暴露操作。

访问修饰符:

修饰符 说明
public 公开,谁都可以访问
private 私有,只有本类内部可访问
protected 保护,本类和子类可访问
internal 同一程序集内可访问

属性(Property):get/set 简化封装

class Student
{
    private string _name;   // 私有字段
    private int _age;

    // 传统写法(手写 get/set)
    public string Name
    {
        get { return _name; }
        set
        {
            if (string.IsNullOrEmpty(value))
                value = "匿名";
            _name = value;
        }
    }

    // 可以限制只读或只写
    public int Age
    {
        get { return _age; }
        private set { _age = value; }  // 只在类内部可改
    }

    // 自动属性(无逻辑时用,编译器自动生成字段)
    public string Major { get; set; }      // 读写
    public string Id { get; }              // 只读(构造中赋值)
    public int Score { private get; set; } // 只写(实际很少用)

    public Student(string name, int age)
    {
        Name = name;
        Age = age;
    }
}

例题

例题1: 一个银行账户类,余额不能直接改,只能通过存款/取款。

class BankAccount
{
    public string Owner { get; }       // 只读:开户名
    public decimal Balance { get; private set; }  // 公读私写:余额

    public BankAccount(string owner, decimal initMoney)
    {
        Owner = owner;
        Balance = initMoney;
    }

    // 存款
    public void Deposit(decimal amount)
    {
        if (amount <= 0)
        {
            Console.WriteLine("存款金额必须大于0");
            return;
        }
        Balance += amount;
        Console.WriteLine($"成功存入{amount:C},当前余额{Balance:C}");
    }

    // 取款
    public bool Withdraw(decimal amount)
    {
        if (amount <= 0)
        {
            Console.WriteLine("取款金额必须大于0");
            return false;
        }
        if (amount > Balance)
        {
            Console.WriteLine($"余额不足!(剩余{Balance:C})");
            return false;
        }
        Balance -= amount;
        Console.WriteLine($"成功取出{amount:C},剩余{Balance:C}");
        return true;
    }
}

// 调用
BankAccount acc = new BankAccount("张三", 1000);
acc.Deposit(500);        // 存入¥500.00,当前余额¥1,500.00
acc.Withdraw(2000);      // 余额不足!
acc.Withdraw(800);       // 成功取出¥800.00,剩余¥700.00
// acc.Balance = 99999;  // 编译报错:private set 外部不能改

练习题

  1. 写一个 User 类:Password 字段外部只能写(修改密码),不能读;UserName 可读不可写;提供 CheckPassword(string pwd) 验证密码是否正确。

  2. 写一个 Circle(圆)类:Radius 半径在 set 时必须 >0,否则设为1;提供 Area 只读属性返回面积。

  3. 写一个 Employee 类:字段 name、salary;Salary 在 set 时涨幅不能超过 30%(例如原来 10000,新值不能超过 13000)。

  4. 写一个 LightBulb(灯泡)类:字段 bool isOn(私有);方法 TurnOn()、TurnOff()、Toggle()(切换状态)、ShowState()(显示"亮/灭")。