第4章 C#面向对象面试题:封装继承多态、接口与抽象类、SOLID原则
本章聚焦C#面向对象三大特性、接口与抽象类的本质区别、SOLID原则的实际应用。面试中高频出现概念辨析、设计选择、原则落地等问题,需要掌握结构化回答框架和典型示例。
接口与抽象类核心对比
| 对比维度 | 接口(interface) | 抽象类(abstract class) |
|---|---|---|
| 声明 | interface IExample | abstract class Example |
| 字段 | 不能包含(C# 8之前) | 可以包含实例字段 |
| 构造方法 | 无 | 可以有(用于子类初始化) |
| 默认实现 | C# 8.0+ 支持 | 支持(virtual/abstract方法) |
| 多继承 | 一个类可实现多个接口 | 一个类只能继承一个抽象类 |
| 访问修饰符 | 成员默认 public | 可定义不同访问级别 |
卡片 1:简述面向对象三大特性(封装、继承、多态)及其在C#中的体现
面试官考察点:基础概念清晰度、能否结合实际代码说明、理解层次(不仅仅是背诵定义)。
回答框架:定义→C#具体语法/关键字→代码示例(口头简述)→设计意义。
简短示例回答:“封装:用访问修饰符(private/protected/internal)隐藏实现细节,通过属性(get/set)控制访问。继承:C#单继承,子类通过‘:’继承基类,可重写虚方法。多态:通过virtual/override实现运行时多态,或通过接口实现编译时多态。” (约80字)
可能追问:① new 和 override 的区别?② 如何实现多态?③ 继承破坏了封装吗?
卡片 2:接口和抽象类有什么区别?实际开发中如何选择?
面试官考察点:设计能力、语法细节掌握、对C#新特性(默认接口方法)的了解。
回答框架:语法区别→设计意图→选择原则→举例说明。
简短示例回答:“语法上:抽象类可有字段、构造方法;接口纯抽象(C#8前)。选择原则:当多个类有共同状态或共享逻辑时用抽象类;当定义行为契约且需要多继承时用接口。例如交通工具抽象类‘Vehicle’有速度字段;‘ICloneable’接口仅定义克隆契约。” (约90字)
可能追问:① C# 8 新增的默认接口方法对设计的影响?② 接口可以包含静态成员吗?
卡片 3:请解释SOLID原则中你最常用的两个原则(如单一职责和开闭原则)
面试官考察点:原则理解深度、能否与项目经验结合、是否真的用原则指导编码。
回答框架:原则定义→违反后果→正面案例→反面案例。
简短示例回答:“单一职责(SRP):一个类只应有一个变化原因。如订单类不应同时处理日志和邮件。开闭原则(OCP):对扩展开放,对修改关闭。通过依赖抽象实现,如用IOrderRepository接口增加新数据源,而不修改业务逻辑。” (约85字)
可能追问:① 依赖倒置(DIP)和开闭的区别?② 里氏替换原则(LSP)违反的典型场景?③ 你项目中哪里用到了SOLID?
- ✅ 能口头写出C#中virtual/override/sealed/new的用法区别
- ✅ 能说出C# 8接口默认实现的两种使用场景(版本兼容、trait模式)
- ✅ 能用一个项目例子说明“对扩展开放,对修改关闭”
- ✅ 能解释“多用组合,少用继承”与SOLID的关系