3.2 封装、继承与多态
封装(Encapsulation)
概念与作用
封装是面向对象编程(OOP)的三大特性之一,其核心思想是:
- 数据隐藏:通过访问修饰符(
private/protected等)限制对类内部数据的直接访问。 - 行为暴露:通过公共方法(
public)提供对数据的可控操作。
实现方式
public class BankAccount
{
private decimal _balance; // 私有字段
public void Deposit(decimal amount)
{
if (amount > 0) _balance += amount; // 通过方法控制数据修改
}
public decimal GetBalance() => _balance; // 通过方法提供数据访问
}
优势
- 防止数据被意外破坏
- 便于修改内部实现而不影响外部代码
- 提高代码可维护性
继承(Inheritance)
基本语法
public class Animal // 基类
{
public void Eat() => Console.WriteLine("Eating...");
}
public class Dog : Animal // 派生类
{
public void Bark() => Console.WriteLine("Woof!");
}
关键特性
- 代码复用:派生类自动获得基类的非私有成员
- 扩展性:派生类可添加新成员或重写基类方法
- 继承链:支持多级继承(但C#不支持多重继承)
注意事项
- 使用
sealed关键字可禁止类被继承 - 基类构造函数通过
base()调用 - 推荐使用组合而非深度继承层次
多态(Polymorphism)
编译时多态(重载)
public class Calculator
{
public int Add(int a, int b) => a + b;
public double Add(double a, double b) => a + b; // 方法重载
}
运行时多态(重写)
public class Shape
{
public virtual void Draw() => Console.WriteLine("Drawing shape");
}
public class Circle : Shape
{
public override void Draw() => Console.WriteLine("Drawing circle"); // 方法重写
}
接口多态
public interface ILogger
{
void Log(string message);
}
public class FileLogger : ILogger { /* 实现 */ }
public class DatabaseLogger : ILogger { /* 实现 */ }
多态的应用场景
- 统一接口处理不同子类对象
- 插件式架构设计
- 减少条件分支语句
三者的协同关系
| 特性 | 解决的问题 | 典型应用场景 |
|---|---|---|
| 封装 | 数据安全与模块化 | 类设计、API开发 |
| 继承 | 代码复用与层次化 | UI控件、领域模型 |
| 多态 | 行为多样化与扩展性 | 插件系统、算法策略 |
最佳实践:优先使用组合而非继承,合理使用
protected访问级别,避免过度多态导致的复杂性。
常见面试问题
- 如何防止派生类重写方法?(使用
sealed修饰方法) new关键字在继承中的作用?(隐藏基类成员而非重写)- 抽象类与接口在多态中的区别?
这个Markdown内容包含:
- 核心概念的理论解释
- 可运行的代码示例
- 对比表格和关系说明
- 实际应用建议
- 面试常见问题
- 规范的导航链接
需要调整任何技术细节或补充示例请随时告知。