无法将子类型列表传递到接口类型列表(由子类型实现)到 Visual Basic 中的函数 + 也不能强制转换

我只需要使用 1 个函数来处理包含接口类型的列表,以便我可以为每个子类型重用它,但在处理函数调用堆栈更高层的列表项时,我还需要知道具体类型:

LoadAItems调用GetA调用FilterItems.

FilterItems需要是通用的,以便也GetB可以调用和使用它。

问题是FilterItems不允许尝试将子类型列表传递给通用方法:

“无法将类型 'List(Of AListItem)' 转换为参数类型 'List(Of IListItem)'”

我尝试将列表中的每个 AListItem 对象转换为 IListItem 并将其添加到新列表中,但问题是该FilterItems函数应该从列表中删除元素。如果我从新列表中删除元素,那么它不会影响旧列表。我可以将它转换回来,但这只是为了能够使用该功能而很麻烦。

我不能只是将所有内容都更改为,List(Of IListItem)因为那样我需要始终将返回的值从FilterItemsGetA/ 中转换,GetB因为LoadAItems/LoadBItems需要知道具体类型。

我可以理解为什么向下转换是不好的,但为什么我不能向上转换为具体类型正在实现的接口类型?

我已经尝试过:

FilterItems(CType(items, List(Of IListItem))

但这是不允许的:

“类型‘List(Of AListItem)’的值不能转换为‘List(Of IListItem)’”

这是我的代码示例:

Public Class AListItem
    Implements IListItem

    'Properties here

End Class

Public Class BListItem
    Implements IListItem

    'Properties here

End Class

Private Sub FilterItems(items As List(Of IListItem))
    'Remove items from the list that meet some condition
    items.RemoveAll(Function(item) ...)     

    'Does not matter what the items class type is
End Sub

Public Function GetA() As List(Of AListItem)
    Dim items As List(Of AListItem)

    items = CallDatabase()

    FilterItems(items) ' Does not allow!

    Return items
End Function

Public Function GetB() As List(Of BListItem)
    Dim items As List(Of BListItem)

    items = CallDatabase()

    FilterItems(items) ' Does not allow!

    Return items

End Function

Public Sub LoadAItems()
    Dim items As List(Of AListItem)

    items = GetA()

    'Do specific AListItem stuff (cannot use interface!)
End Sub

Public Sub LoadBItems()
    Dim items As List(Of BListItem)

    items = GetB()

    'Do specific BListItem stuff (cannot use interface!)
End Sub
视觉文森特

如果我正确理解您要做什么,您应该能够使函数本身通用:

Private Sub FilterItems(Of T As IListItem)(items As List(Of T))

Of T As IListItem添加一个T必须是或继承自的约束IListItem

然后你可以这样称呼它:

Public Function GetA() As List(Of AListItem)
    Dim items As List(Of AListItem)

    items = CallDatabase()

    FilterItems(Of AListItem)(items)

    Return items
End Function

Public Function GetB() As List(Of BListItem)
    Dim items As List(Of BListItem)

    items = CallDatabase()

    FilterItems(Of BListItem)(items)

    Return items
End Function

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章