求解C#接口重实现替代方案,理解《C#9 in a Nutshell》加粗内容
接口重实现替代方案通俗解释
核心逻辑是从基类设计层面提前规避接口重实现的需求,完全避开接口重实现的两个固有问题,两个方案对应两种接口实现场景分别处理:
方案1:隐式实现接口成员时,合适场景标记为virtual
隐式实现是最常用的接口实现方式:直接声明public的同名方法,无需加接口前缀,类实例和接口实例调用都走该方法逻辑。
这个方案本质是提前预留扩展口子:如果你预判后续子类可能需要修改该方法的逻辑,直接给隐式实现的方法加virtual关键字,后续子类直接通过override关键字重写即可,完全不需要重实现整个接口,还可以自由调用base.方法名()触发基类逻辑。
方案2:显式实现接口成员时,用「接口方法转发到保护虚方法」的模式
显式实现接口的特性是方法前加接口名前缀,方法默认是私有级别,只有转成接口类型才能调用,且不能直接加virtual关键字,本来子类完全没法直接重写,要改逻辑只能重实现接口,必然踩坑。
书里给出的模式逻辑非常简单:
- 显式实现的接口方法不写任何业务逻辑,只做转发调用同一个类里的另一个
protected virtual的同名方法,所有实际逻辑都放在这个保护虚方法里 - 子类要改逻辑直接override这个保护虚方法即可,完全不需要碰接口
- 当接口被调用时,显式实现的方法会自动调用已经被子类重写后的虚方法,完全符合预期,也支持子类调用基类方法
兜底方案
如果你的类从设计上就不需要被继承,直接给类加sealed关键字禁止继承,从根源上杜绝接口重实现的可能性。
内容的提问来源于stack exchange,提问作者BHoltzman
相关产品推荐
相关产品推荐

