通用方法中的“这个类”?

时间:2015-12-09 19:06:46

标签: vb.net generics

我仍在计算通用方法和签名,我怀疑这是一个常见问题解答,但是......

我有一个名为DtaRow的基类,主要由List(Of String)组成。我有几个DtaRow的子类和其他方法,没有其他更改。所以我们有一个DateRow,它有一个名为TheDate的方法,它从List中获取一个项目,并根据该字符串返回一个DateTime。我们有另一个名为NumberRow的类,其中一个TheNumber从List中选择一个不同的项目,Double.Parses它到一个Double。等

我想有一个方法返回* Row的深层副本。由于所有这些类的所有数据都相同,因此您可以在DtaRow中编写一个方法来执行此操作。但是,它只能返回丢失方法的DtaRow。所以我这样做了......

Dim TD As DateRow = TempD.CopyTo(Of DateRow)

要调用此方法,我必须这样做......

{{1}}

看来这没有用,因为我仍然有一个“演员”,这正是我想避免的。有没有一种方法可以在没有(Of T as DtaRow)的情况下编写这个,是否有一个语法(Of T as WhatEverClassImBeingCalledOn),或者某种方式没有输入类型输入?

1 个答案:

答案 0 :(得分:0)

您可以使用Curiously recurring template pattern的.Net变体。

鉴于这些课程:

MustInherit Class DtaRow(Of T As {DtaRow(Of T), New})

    Function Copy() As T
        Return new T()
    End Function

End Class

Class DateRow 
    Inherits DtaRow(of DateRow)

End Class

Copy的子类上调用DtaRow会返回正确类型的对象:

Dim dt = new DateRow()
Dim copy = dt.Copy()
Debug.Assert(copy.GetType() = GetType(DateRow))

明显的缺点:

  • DtaRow必须是通用的
  • 您可能会搞乱子类中的泛型类型参数

但是没有其他方法可以告诉DtaRow中的方法返回子类类型的对象。

如果您不想制作DtaRow,则必须在每个子类中实现一种方法(可以简单地调用Copy DtaRow方法只能将它转换为自己的类型。)