如何在类中创建泛型方法?

时间:2010-04-28 17:21:56

标签: c# vb.net generics syntax

我真的想遵循DRY原则。我有一个看起来像这样的子?

Private Sub DoSupplyModel

        OutputLine("ITEM SUMMARIES")
        Dim ItemSumms As New SupplyModel.ItemSummaries(_currentSupplyModel, _excelRows)
        ItemSumms.FillRows()
        OutputLine("")

        OutputLine("NUMBERED INVENTORIES")
        Dim numInvs As New SupplyModel.NumberedInventories(_currentSupplyModel, _excelRows)
        numInvs.FillRows()
        OutputLine("")   

End Sub

我想将这些内容整合到一个使用泛型的方法中。对于记录,ItemSummaries和NumberedInventories都是从相同的基类DataBuilderBase派生的。

我无法弄清楚允许我在方法中执行ItemSumms.FillRows和numInvs.FillRows的语法。

FillRows在基类中声明为Public Overridable Sub FillRows

提前致谢。

修改
这是我的最终结果

Private Sub DoSupplyModels()

    DoSupplyModelType("ITEM SUMMARIES",New DataBlocks(_currentSupplyModel,_excelRows)
    DoSupplyModelType("DATA BLOCKS",New DataBlocks(_currentSupplyModel,_excelRows)

End Sub

Private Sub DoSupplyModelType(ByVal outputDescription As String, ByVal type As DataBuilderBase)
    OutputLine(outputDescription)
    type.FillRows()
    OutputLine("")
End Sub

但要回答我自己的问题......我本可以做到这一点......

Private Sub DoSupplyModels()

    DoSupplyModelType(Of Projections)("ITEM SUMMARIES")
    DoSupplyModelType(Of DataBlocks)("DATA BLOCKS")

End Sub

Private Sub DoSupplyModelType(Of T as DataBuilderBase)(ByVal outputDescription As String, ByVal type As T)
    OutputLine(outputDescription)
    Dim type as New DataBuilderBase (_currentSupplyModel,_excelRows)
    type.FillRows()
    OutputLine("")
End Sub

是吗?

赛斯

4 个答案:

答案 0 :(得分:3)

正如其他人所指出的那样,你不需要泛型来做你想做的事情,但我会回答技术问题的完整性:

Private Sub MyMethod(Of T As DataBuilderBase)(ByVal instance As T)
    instance.FillRows()
End Sub

然后通过执行以下操作调用该方法:

MyMethod(Of ItemSummaries)(new SupplyModel.ItemSummaries(...))

答案 1 :(得分:1)

你可以重构利用共享基础和使用多态的事实:( VB有点生疏,你应该明白了)

你可以有一个方法:

Private Sub FillAndOutput(textToOutput as String, filler as DataBuilderBase)
    OutputLine(string)        
    filler.FillRows()
    OutputLine("")
end sub
你可以打电话给

Private Sub DoSupplyModel
    FillAndOutput("ITEM SUMMARIES",New SupplyModel.ItemSummaries(_currentSupplyModel, _excelRows))
    FillAndOutput("NUMBERED INVENTORIES",New SupplyModel.NumberedInventories(_currentSupplyModel, _excelRows))        

End Sub

答案 2 :(得分:1)

基本上,您需要指定T将是实现FillRows方法的基类型的子类。在C#中,这看起来像是

private void myFunction<T>( T someList ) where T : DataBuilderBase {
    someList.FillRows();
}

找到一个VB.NET example on MSDN

编辑,凯文是对的,多态性可能会更好地处理。

答案 3 :(得分:0)

在这种情况下,我不认为重构泛型函数是合理的,即使以重复自己为代价。你有两个选择:

  1. 重构代码,使其允许无参数构造函数,并在更高的继承级别创建一个函数,允许您指定当前传递给构造函数的参数。
  2. 使用显式反射来实例化泛型类型,并将这些参数传递给构造函数。
  3. 这些选项中的任何一个都涉及非常微不足道的工作而且收益很少(您将三行代码转换为一行)。

    但是,为了回答您的问题,VB.NET使用of关键字来指定泛型类型参数

    Public Sub Foo(Of T)(argument as T)
       ...
    End Sub