我只需要使用 1 个函数来处理包含接口类型的列表,以便我可以为每个子类型重用它,但在处理函数调用堆栈更高层的列表项时,我还需要知道具体类型:
LoadAItems
调用GetA
调用FilterItems
.
FilterItems
需要是通用的,以便也GetB
可以调用和使用它。
问题是FilterItems
不允许尝试将子类型列表传递给通用方法:
“无法将类型 'List(Of AListItem)' 转换为参数类型 'List(Of IListItem)'”
我尝试将列表中的每个 AListItem 对象转换为 IListItem 并将其添加到新列表中,但问题是该FilterItems
函数应该从列表中删除元素。如果我从新列表中删除元素,那么它不会影响旧列表。我可以将它转换回来,但这只是为了能够使用该功能而很麻烦。
我不能只是将所有内容都更改为,List(Of IListItem)
因为那样我需要始终将返回的值从FilterItems
或GetA
/ 中转换,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] 删除。
我来说两句