有关具有不同返回类型的函数重载的问题

ElektroStudios

我有一个像这样的功能:

Public Shared Iterator Function MyFunction(ByVal param1 As String) _
As IEnumerable(Of FileInfo)
    ...
End Function

我想添加一个采用SAME参数Type的重载,但更改返回类型为

Public Shared Iterator Function MyFunction(ByVal param1 As String) _
As IEnumerable(Of String)
    ...
End Function

是否可以在不更改param1类型的情况下完成?,我曾考虑过在两个函数上添加Type参数,Function MyFunction(Of T)(ByVal param1 As String) As Ienumerable(Of T)以期望如下所示的用法:

Dim collection As IEnumerable(Of String) = MyFunction(Of String)("")
Dim collection As IEnumerable(Of FileInfo) = MyFunction(Of FileInfo)("")

但是要做到这一点,我还需要更改param1值的类型,并且我也看到了通过人为错误传递不同类型参数的缺点,例如以as的形式调用函数Return MyFunction(Of Integer)(""),然后在函数内部为意外的类型参数添加错误处理...似乎不是一种干净/安全的方法。

所以我明确地想使用相同的函数名称param1作为String,并在每个函数上返回不同的枚举,我完全知道一个函数会返回Object或以这种方式将类型参数弄乱,我不认为这是一个干净的解决方案:

Public Shared Iterator Function MyFunction(Of T)(ByVal param1 As String) _
As IEnumerable(Of T)

   Select Case GetType(T)

      Case GetType(String)
          Yield CTypeDynamic(Of T)(param1)

      Case GetType(FileInfo)
          Yield CTypeDynamic(Of T)(New FileInfo(param1))

      Case Else
          Throw New ArgumentException("Unexpected Type parameter", "T")

   End Case

End Function

哪种方法可以解决此问题?...这真的符合我提出的要求吗?

比昂·罗格·克林佐(Bjørn-RogerKringsjå)

在这种情况下,法律上/事实上是简单地重命名每个函数以反映返回类型。实际上,这是我推荐唯一方法。

Public Shared Iterator Function GetStrings(ByVal param1 As String) As IEnumerable(Of String)
End Function

Public Shared Iterator Function GetFiles(ByVal param1 As String) As IEnumerable(Of FileInfo)
End Function

选项1

但是,如果您可以忍受几个模棱两可的警告,那么一个选择是创建实现IEnumerable(T)的自定义返回类型

Public Class MyFunctionIterator
    Implements IEnumerable, IEnumerable(Of String), IEnumerable(Of FileInfo)

    Friend Sub New(param1 As String)
        Me.param1 = param1
    End Sub

    Private param1 As String

    Public Iterator Function GetStrings() As IEnumerator(Of String) Implements IEnumerable(Of String).GetEnumerator
        For Each item As String In {"a", "b", "c", "d"}
            Yield item
        Next
    End Function

    Public Iterator Function GetFiles() As IEnumerator(Of FileInfo) Implements IEnumerable(Of FileInfo).GetEnumerator
        For Each name As String In Directory.GetFiles(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments))
            Yield New FileInfo(name)
        Next
    End Function

    Private Iterator Function GetEnumerator() As IEnumerator Implements IEnumerable.GetEnumerator
        Throw New NotSupportedException()
    End Function

End Class

Public Shared Function MyFunction(ByVal param1 As String) As MyFunctionIterator
    Return New MyFunctionIterator(param1)
End Function

用法

Dim collection1 As IEnumerable(Of String) = MyFunction("...")
Dim collection2 As IEnumerable(Of FileInfo) = MyFunction("...")

For Each s In collection1
    Debug.Write(s & ", ")
Next

Debug.WriteLine("")

For Each fi In collection2
    Debug.Write(fi.Name & ", ")
Next

a,b,c,d,
desktop.ini,file1.txt,file2.txt,file3.txt,


选项2

如果您使用接口,则另一种选择是创建自定义返回类型并定义转换运算符

Public Class MyFunctionResult

    Friend Sub New(param1 As String)
        Me.param1 = param1
    End Sub

    Private param1 As String

    Public Function GetString() As String
        Return ("Hello " & Me.param1 & "!")
    End Function

    Public Shared Widening Operator CType(value As MyFunctionResult) As String
        Return value.GetString()
    End Operator

    Public Function GetFile() As FileInfo
        Return New FileInfo(Me.param1)
    End Function

    Public Shared Widening Operator CType(value As MyFunctionResult) As FileInfo
        Return value.GetFile()
    End Operator

End Class

Public Shared Function MyFunction(ByVal param1 As String) As MyFunctionResult
    Return New MyFunctionResult(param1)
End Function

用法

Dim s As String = MyFunction("Bjørn")
Dim fi As FileInfo = MyFunction("C:\Users\bjorn\Documents\file1.txt")

Debug.WriteLine(s)
Debug.WriteLine(fi.Name)

你好比约恩!
file1.txt

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章