抽象类&接口 面试3道笔试题(含标准答案,面试高频)
题目1(基础简答)
简述接口和抽象类区别,项目怎么选用?
参考答案:
- 继承:抽象类单继承;接口多实现。
- 成员:抽象类有字段、构造、任意访问修饰符、实体方法;接口无实例字段,C#8前只有抽象签名,C#8可写默认实现。
- 关系:抽象is-a,接口can-do。
选用:共用字段、重复代码、父子继承用抽象类;定义契约、多能力扩展、解耦DI用接口;工程常用:接口定义约束+抽象类封装公共代码。
题目2(场景题)
做支付系统:微信支付、支付宝、银联支付,三者都有签名验签、生成订单公共逻辑,各自支付发起逻辑不同。如何设计?
参考答案:
- 定义
IPayment接口,约束统一行为:Pay()、QueryOrder(); - 新建抽象类
BasePayment : IPayment,封装公共:签名、验签、生成订单; - 微信/支付宝/银联类继承抽象类,只重写各自Pay实现。
思路:接口定标准,抽象抽公用,具体类实现差异化。
题目3(易错选择题+解析)
下列说法错误的是()
A. 抽象类不能实例化
B. 接口中成员默认public,不能手动指定访问修饰符
C. 一个类可以同时继承抽象类并实现多个接口
D. C#7.3接口可以定义实例字段
答案:D
解析:
无论哪个C#版本,接口都不能定义实例字段;抽象类才可以定义成员字段。
附加面试小追问(随口问答)
问:C#8接口默认实现解决了什么痛点?
答:旧接口新增抽象方法,全部实现类要改代码;默认实现可以给新方法写默认逻辑,原有实现类无需改动。
