[英]Why can't I recast my concrete type as an interface
我希望實現在模型中對類進行比較和排序的功能。 我的模型中的所有對象都需要一些與比較有關的通用功能,因此我創建了一個實現IComparer
的抽象BaseComparer
。
Public MustInherit Class BaseComparer(Of T)
Implements IComparer(Of T)
End Class
模型中的每個類都有其自己的BaseComparer
具體實現。
Public Class PersonComparer
Inherits BaseComparer(Of Person)
End Class
然后,我有一個ComparerFactory
,它負責創建和初始化比較器:
Public Class ComparerFactory
Public Shared Function GetComparer(ByVal target As Type) As IComparer
If target Is GetType(Person) Then
Return New PersonComparer()
ElseIf target Is GetType(Organization) Then
Return New OrganizationComparer()
ElseIf 'etc...
End If
End Function
End Class
問題是ComparerFactory.GetComparer
引發以下錯誤 。 有趣的是,代碼可以很好地編譯,但是它只會在運行時出錯。
無法將類型為“ PersonComparer”的對象轉換為類型為“ System.Collections.IComparer”的對象。
PersonComparer
繼承自實現IComparer
BaseComparer
。 我在這里想念什么? 為什么不能投射? 我懷疑這與IComparer(Of T)
您的抽象類實現了通用接口IComparer(Of T)
,但沒有實現非通用接口 IComparer
。 實際上,它們是兩個不同的接口,它們甚至通過繼承也不相互關聯。
您可以簡單地讓您的抽象類實現兩個接口:
Public MustInherit Class BaseComparer(Of T)
Implements IComparer(Of T), IComparer
End Class
有兩種不同的接口:
IComparer (http://msdn.microsoft.com/en-us/library/system.collections.icomparer.aspx)
和
IComparer<T> (http://msdn.microsoft.com/en-us/library/8ehhxeaf.aspx)
后者的通用接口不會從前者繼承。
我建議您也讓BaseComparer直接實現非通用IComparer。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.