VB.NET如何通过接口实现类似多重继承(重叠继承)的功能
实现逻辑拆解
首先明确当前类层级的核心限制:
- B1和S1分属Base下的两个独立继承分支,没有可以共同挂载F4方法的公共非抽象父类
- 如果把F4加在Base上,S2会继承到F4,违反权限要求;如果加在SubBase上,B1无法获取到F4
- 如果在B1、S1里分别写F4实现,会造成逻辑重复,不符合开发规范
可兼容全.NET版本的实现方案
这个方案不需要依赖高版本语法,完全满足无重复代码、权限隔离的要求:
- 定义专用接口圈定F4的开放范围
单独建一个只声明F4方法的接口,所有需要开放F4的类实现这个接口,S2全程不接入这个接口,从根源上隔离S2的访问权限:Public Interface IF4Capable Function F4() As Int32 End Interface - 抽取共享逻辑,消除重复代码
把F4的所有复杂业务逻辑单独封装成独立的逻辑类,所有需要F4能力的类都复用这个逻辑实例,后续修改F4逻辑只需要改这一个类的代码:Public Class F4LogicProvider Public Function CalculateF4() As Int32 ' 原F4逻辑:Return 4 ' 所有复杂业务逻辑全部在这里维护 Return 4 End Function End Class - 按权限要求接入对应类
- B1类实现IF4Capable接口,内部持有共享的逻辑实例,将F4调用转发给共享逻辑
Public Class B1 Inherits Base Implements IF4Capable Private ReadOnly _f4Logic As New F4LogicProvider() Public Function F4() As Int32 Implements IF4Capable.F4 Return _f4Logic.CalculateF4() End Function End Class - S1类实现IF4Capable接口,复用同一个共享逻辑实例
Public Class S1 Inherits SubBase Implements IF4Capable Private ReadOnly _f4Logic As New F4LogicProvider() Public Function F4() As Int32 Implements IF4Capable.F4 Return _f4Logic.CalculateF4() End Function End Class - S2类完全不做修改,不接入IF4Capable接口,自然不会暴露F4方法:
Public Class S2 Inherits SubBase Public Function F3() As Int32 Return 3 End Function End Class
- B1类实现IF4Capable接口,内部持有共享的逻辑实例,将F4调用转发给共享逻辑
方案校验
- 原有方法兼容性:B1、S1、S2全部保留原有继承关系,
F1、F2、F3的开放范围完全没有变化,不会影响现有业务调用 - F4权限隔离:仅B1、S1实例可以调用F4方法,S2实例无任何途径访问到F4
- 代码无重复:F4的全部逻辑集中在共享逻辑类中,没有重复实现
高版本项目简化方案
如果项目使用的是.NET Core 3.0及以上、支持VB接口默认实现的版本,可以省去逻辑转发和独立逻辑类的步骤:直接把F4的实现逻辑写在IF4Capable接口中,B1和S1只要声明实现接口,就自动拥有F4方法,S2只要不实现接口,就完全无法访问F4,代码量更少。
示例代码:
Public Interface IF4Capable ' 直接在接口内实现F4逻辑,所有实现类自动继承该逻辑 Function F4() As Int32 Return 4 End Function End Interface Public Class B1 Inherits Base Implements IF4Capable End Class Public Class S1 Inherits SubBase Implements IF4Capable End Class
内容的提问来源于stack exchange,提问作者user1889116
相关产品推荐
相关产品推荐

