我仍在计算通用方法和签名,我怀疑这是一个常见问题解答,但是......
我有一个名为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),或者某种方式没有输入类型输入?
答案 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
方法只能将它转换为自己的类型。)