< 返回教程列表
2.2 封装
知识介绍
封装 = 把数据藏起来(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 外部不能改
练习题
写一个
User类:Password字段外部只能写(修改密码),不能读;UserName可读不可写;提供CheckPassword(string pwd)验证密码是否正确。写一个
Circle(圆)类:Radius半径在 set 时必须 >0,否则设为1;提供Area只读属性返回面积。写一个
Employee类:字段name、salary;Salary在 set 时涨幅不能超过 30%(例如原来 10000,新值不能超过 13000)。写一个
LightBulb(灯泡)类:字段bool isOn(私有);方法TurnOn()、TurnOff()、Toggle()(切换状态)、ShowState()(显示"亮/灭")。