You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在泛型类中带参数创建派生类实例以规避BC32085错误?

解决VB.NET泛型中创建带参数实例的BC32085错误

核心问题

VB.NET泛型的New约束仅支持无参构造函数,无法直接通过New T(参数)调用带参构造,这就是BC32085错误的根源。结合你需要不可变性(仅保留带参构造)和DRY原则的需求,推荐使用工厂接口+泛型约束的方案,既保证类型安全,又避免重复代码。

具体实现步骤

1. 定义工厂接口

创建一个接口,声明创建实例的方法,对应你的带参构造逻辑:

Public Interface IDataFactory(Of T As B)
    Function Create(s1 As String, s2 As String) As T
End Interface

2. 为D1、D2实现工厂类

每个数据类对应一个极简的工厂实现,逻辑无冗余:

Public Class D1Factory
    Implements IDataFactory(Of D1)
    Public Function Create(s1 As String, s2 As String) As D1 Implements IDataFactory(Of D1).Create
        Return New D1(s1, s2)
    End Function
End Class

Public Class D2Factory
    Implements IDataFactory(Of D2)
    Public Function Create(s1 As String, s2 As String) As D2 Implements IDataFactory(Of D2).Create
        Return New D2(s1, s2)
    End Function
End Class

3. 修改泛型类ExemplarIssue

将工厂接口作为依赖注入到泛型类中,替换直接New T的方式:

Public Class ExemplarIssue(Of T As B)
    Private ReadOnly _factory As IDataFactory(Of T)

    ' 通过构造函数注入对应数据类的工厂
    Public Sub New(factory As IDataFactory(Of T))
        _factory = factory
    End Sub

    Public Sub Test1()
        ' 用工厂创建带参数的实例,无BC32085错误
        Dim y As T = _factory.Create("1", "2")
        Dim z As New Collections.Generic.List(Of T)
        z.Add(y)
    End Sub
End Class

4. 调整数据类实现不可变性

移除无参构造函数,仅保留带参构造,并将属性设为只读:

Public MustInherit Class B
    Public ReadOnly Property S1 As String
    Public ReadOnly Property S2 As String

    ' 移除无参构造,强制必须传入参数
    Protected Sub New(s1 As String, s2 As String)
        ' 这里可以加入基类的通用校验逻辑
        S1 = s1
        S2 = s2
    End Sub
End Class

Public Class D1
    Inherits B
    ' 仅保留带参构造,继承基类的校验和属性
    Public Sub New(s1 As String, s2 As String)
        MyBase.New(s1, s2)
        ' D1专属的校验逻辑
    End Sub
End Class

Public Class D2
    Inherits B
    Public Sub New(s1 As String, s2 As String)
        MyBase.New(s1, s2)
        ' D2专属的校验逻辑
    End Sub
End Class

5. 使用方式

创建泛型实例时传入对应的工厂即可:

' 创建D1的数据集处理类
Dim d1Issue As New ExemplarIssue(Of D1)(New D1Factory())
d1Issue.Test1()

' 创建D2的数据集处理类
Dim d2Issue As New ExemplarIssue(Of D2)(New D2Factory())
d2Issue.Test1()

方案优势

  • 类型安全:编译期就能检查工厂与数据类的匹配,避免反射的运行时风险
  • 符合DRY:泛类ExemplarIssue只需写一次,工厂类逻辑极简无重复
  • 支持不可变性:数据类仅保留带参构造,保证实例创建时必须传入数据,属性只读无法修改
  • 扩展性强:新增D3类时,只需新增对应的工厂类,无需修改ExemplarIssue

内容的提问来源于stack exchange,提问作者AJD

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 23:10:20