第4章 C#面向对象面试题:封装继承多态、接口与抽象类、SOLID原则

本章聚焦C#面向对象三大特性、接口与抽象类的本质区别、SOLID原则的实际应用。面试中高频出现概念辨析、设计选择、原则落地等问题,需要掌握结构化回答框架和典型示例。

需要定义行为契约? 需要共享状态/默认实现? 使用抽象类 仅定义行为/多继承? 使用接口 注意:C# 8.0+ 接口可含默认实现

接口与抽象类核心对比

对比维度 接口(interface) 抽象类(abstract class)
声明interface IExampleabstract class Example
字段不能包含(C# 8之前)可以包含实例字段
构造方法无可以有(用于子类初始化)
默认实现C# 8.0+ 支持支持(virtual/abstract方法)
多继承一个类可实现多个接口一个类只能继承一个抽象类
访问修饰符成员默认 public可定义不同访问级别

卡片 1:简述面向对象三大特性(封装、继承、多态)及其在C#中的体现

面试官考察点:基础概念清晰度、能否结合实际代码说明、理解层次(不仅仅是背诵定义)。

回答框架:定义→C#具体语法/关键字→代码示例(口头简述)→设计意义。

简短示例回答:“封装:用访问修饰符(private/protected/internal)隐藏实现细节,通过属性(get/set)控制访问。继承:C#单继承,子类通过‘:’继承基类,可重写虚方法。多态:通过virtual/override实现运行时多态,或通过接口实现编译时多态。” (约80字)

可能追问:① new 和 override 的区别?② 如何实现多态?③ 继承破坏了封装吗?

⚠ 避坑提醒:不要只背概念,一定要举具体C#代码例子(如public class Animal { public virtual void Speak() {...} })。避免混淆“多态”和“重载”。

卡片 2:接口和抽象类有什么区别?实际开发中如何选择?

面试官考察点:设计能力、语法细节掌握、对C#新特性(默认接口方法)的了解。

回答框架:语法区别→设计意图→选择原则→举例说明。

简短示例回答:“语法上:抽象类可有字段、构造方法;接口纯抽象(C#8前)。选择原则:当多个类有共同状态或共享逻辑时用抽象类;当定义行为契约且需要多继承时用接口。例如交通工具抽象类‘Vehicle’有速度字段;‘ICloneable’接口仅定义克隆契约。” (约90字)

可能追问:① C# 8 新增的默认接口方法对设计的影响?② 接口可以包含静态成员吗?

⚠ 避坑提醒:不要只说“抽象类可以有实现,接口不能”——C# 8后接口也可以有默认实现。要说明“抽象类表示‘是什么’,接口表示‘能做什么’”。

卡片 3:请解释SOLID原则中你最常用的两个原则(如单一职责和开闭原则)

面试官考察点:原则理解深度、能否与项目经验结合、是否真的用原则指导编码。

回答框架:原则定义→违反后果→正面案例→反面案例。

简短示例回答:“单一职责(SRP):一个类只应有一个变化原因。如订单类不应同时处理日志和邮件。开闭原则(OCP):对扩展开放,对修改关闭。通过依赖抽象实现,如用IOrderRepository接口增加新数据源,而不修改业务逻辑。” (约85字)

可能追问:① 依赖倒置(DIP)和开闭的区别?② 里氏替换原则(LSP)违反的典型场景?③ 你项目中哪里用到了SOLID?

⚠ 避坑提醒:不要只是罗列单词,要说出实际应用场景。例如“使用依赖注入实现DIP”。避免说“所有设计都必须遵循SOLID”——要说明权衡。
📌 核心自检清单
  • ✅ 能口头写出C#中virtual/override/sealed/new的用法区别
  • ✅ 能说出C# 8接口默认实现的两种使用场景(版本兼容、trait模式)
  • ✅ 能用一个项目例子说明“对扩展开放,对修改关闭”
  • ✅ 能解释“多用组合,少用继承”与SOLID的关系