簡體   English   中英

為什么我不能將我的具體類型重鑄為界面

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM