C#面试题更新 2026-08-05

请解释里氏替换原则(LSP)的核心含义,并说明在 C# 编程中可以通过哪些具体方式应用这一原则?

技术原理C#

考察说明

考查对面向对象设计原则中里氏替换原则的理解及其在 C# 中的实践应用能力。

回答思路

  1. 【回答框架 1】里氏替换原则由 Barbara Liskov 提出,核心定义是:子类型必须能够替换其基类型,且程序行为不发生变化。它强调继承关系中的行为兼容性,即子类可以扩展父类功能,但不能改变父类已有的契约或行为。
  2. 【回答框架 2】在 C# 中运用该原则,首先需确保子类重写方法时遵循基类的约定,例如不违反前置条件、后置条件或类不变量。例如,如果基类方法要求参数非负,子类重写时不应接受负值。
  3. 【回答框架 3】具体实践包括:使用虚方法和 override 时,确保子类方法行为与基类意图一致;在集合类型中,如 IEnumerable 和 List,能替换使用;设计接口时,确保实现类遵循接口语义。
  4. 【回答框架 4】常见误区是重写方法时改变返回类型或抛出新异常,导致替换后程序出错。因此,应通过单元测试验证子类实例在基类引用下表现正常,或使用依赖注入和多态来设计可替换的组件。
  5. 【回答框架 5】在 C# 中,也可以通过接口和抽象类来强制实现 LSP,避免直接依赖具体类,同时利用泛型约束或协变逆变(如 IEnumerable<out T>)支持更灵活的类型替换。
  6. 【关键点 1】LSP 要求子类行为兼容父类,替换后不破坏程序正确性。
  7. 【关键点 2】C# 中通过遵循方法契约和一致行为来运用该原则。
  8. 【关键点 3】重写方法时避免改变参数或返回值约定,可借助接口设计和测试保障。
  9. 【易错点 1】错误地认为继承一定能替换,忽略子类改变行为导致的潜在错误。
  10. 【易错点 2】重写方法时放宽或收紧参数范围,违反父类契约。
  11. 【易错点 3】将 LSP 泛化为所有继承都安全,而无视具体场景和约束。