如何利用继承或重载简化仅内部类属性不同的重复类定义?
简化重复类结构的方案
针对你这种结构高度一致、仅内部类属性存在差异的场景,泛型是最简洁的解决方案,可以彻底消除重复代码。以下是具体实现方式:
方案1:泛型基类(保留原类名和属性名)
如果必须保留原有的类名(如Class_1_outer)和属性名(如field_3_1),可以先定义一个泛型基类封装通用结构,再让具体类继承并扩展:
' 泛型基类:封装所有外部类的通用逻辑 Public Class BaseOuter(Of T) Public Property field_1 As String Public Property field_2 As BaseInner(Of T) Public Class BaseInner(Of TInner) ' 通用内部属性,作为子类属性的底层存储 Protected Property InnerValue As TInner End Class End Class ' 具体类1:仅需定义特定的属性名和类型 Public Class Class_1_outer Inherits BaseOuter(Of String) Public Class Class_1_inner Inherits BaseOuter(Of String).BaseInner(Of String) ' 映射到原属性名 Public Property field_3_1 As String Get Return MyBase.InnerValue End Get Set(value As String) MyBase.InnerValue = value End Set End Property End Class ' 重写field_2的类型为当前内部类 Public Shadows Property field_2 As Class_1_inner End Class ' 具体类2:同理扩展 Public Class Class_2_outer Inherits BaseOuter(Of Integer) Public Class Class_2_inner Inherits BaseOuter(Of Integer).BaseInner(Of Integer) Public Property field_3_2 As Integer Get Return MyBase.InnerValue End Get Set(value As Integer) MyBase.InnerValue = value End Set End Property End Class Public Shadows Property field_2 As Class_2_inner End Class
方案2:直接使用泛型类(更简洁,推荐)
如果可以接受统一属性名(如把field_3_1/field_3_2统一为InnerField),无需定义多个重复类,直接用泛型类即可:
Public Class GenericOuter(Of T) Public Property field_1 As String Public Property field_2 As GenericInner(Of T) Public Class GenericInner(Of TInner) Public Property InnerField As TInner End Class End Class ' 使用示例 Dim outer1 As New GenericOuter(Of String)() outer1.field_1 = "外部字符串" outer1.field_2.InnerField = "内部字符串" Dim outer2 As New GenericOuter(Of Integer)() outer2.field_1 = "外部字符串2" outer2.field_2.InnerField = 12345
这种方式完全消除了重复代码,后续新增类似结构只需指定泛型类型即可,维护成本极低。
内容的提问来源于stack exchange,提问作者jaume
相关产品推荐
相关产品推荐

