Tailwind CSSTailwind CSS
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
Home
  • Tailwind CSS 书籍目录
  • Vue 3 开发实战指南
  • React 和 Next.js 学习
  • TypeScript
  • React开发框架书籍大纲
  • Shadcn学习大纲
  • Swift 编程语言:从入门到进阶
  • SwiftUI 学习指南
  • 函数式编程大纲
  • Swift 异步编程语言
  • Swift 协议化编程
  • SwiftUI MVVM 开发模式
  • SwiftUI 图表开发书籍
  • SwiftData
  • ArkTS编程语言:从入门到精通
  • 仓颉编程语言:从入门到精通
  • 鸿蒙手机客户端开发实战
  • WPF书籍
  • C#开发书籍
learn
  • Java编程语言
  • Kotlin 编程入门与实战
  • /python/outline.html
  • AI Agent
  • MCP (Model Context Protocol) 应用指南
  • 深度学习
  • 深度学习
  • 强化学习: 理论与实践
  • 扩散模型书籍
  • Agentic AI for Everyone
langchain
  • 3.2 封装、继承与多态

3.2 封装、继承与多态

封装(Encapsulation)

概念与作用

封装是面向对象编程(OOP)的三大特性之一,其核心思想是:

  1. 数据隐藏:通过访问修饰符(private/protected等)限制对类内部数据的直接访问。
  2. 行为暴露:通过公共方法(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!");
}

关键特性

  1. 代码复用:派生类自动获得基类的非私有成员
  2. 扩展性:派生类可添加新成员或重写基类方法
  3. 继承链:支持多级继承(但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 { /* 实现 */ }

多态的应用场景

  1. 统一接口处理不同子类对象
  2. 插件式架构设计
  3. 减少条件分支语句

三者的协同关系

特性解决的问题典型应用场景
封装数据安全与模块化类设计、API开发
继承代码复用与层次化UI控件、领域模型
多态行为多样化与扩展性插件系统、算法策略

最佳实践:优先使用组合而非继承,合理使用protected访问级别,避免过度多态导致的复杂性。


常见面试问题

  1. 如何防止派生类重写方法?(使用sealed修饰方法)
  2. new关键字在继承中的作用?(隐藏基类成员而非重写)
  3. 抽象类与接口在多态中的区别?

▶ 下一节:3.3 接口与抽象类


这个Markdown内容包含:
- 核心概念的理论解释
- 可运行的代码示例
- 对比表格和关系说明
- 实际应用建议
- 面试常见问题
- 规范的导航链接

需要调整任何技术细节或补充示例请随时告知。
Last Updated:: 5/3/25, 11:01 PM