【问题标题】:Why can't I recast my concrete type as an interface为什么我不能将我的具体类型重铸为接口
【发布时间】:2012-01-04 03:15:50
【问题描述】:

我希望在我的模型中实现对类进行比较和排序的功能。我的模型中的所有对象都需要一些关于比较的通用功能,所以我创建了一个抽象的BaseComparer 来实现IComparer

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 继承自实现IComparerBaseComparer。我在这里想念什么?为什么不能投?我怀疑它与IComparer(Of T)有关

【问题讨论】:

    标签: vb.net generics inheritance interface casting


    【解决方案1】:

    有两种不同的接口:

    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。

    【讨论】:

    • 我希望我能接受两个答案。谢谢您的帮助。这就是我所缺少的。
    【解决方案2】:

    您的抽象类实现了通用接口IComparer(Of T),但不是非通用接口IComparer。这实际上是两个不同的接口,它们之间没有关联,甚至没有继承关系。

    您可以简单地让您的抽象类实现这两个接口:

    Public MustInherit Class BaseComparer(Of T)
        Implements IComparer(Of T), IComparer
    End Class
    

    【讨论】:

    • 我想它们是完全独立的接口是有道理的。出于某种原因,我认为它们在某个地方神奇地连接在一起。谢谢!!!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-20
    相关资源
    最近更新 更多