为什么我不能将我的具体类型重新设置为界面

时间:2011-11-22 18:31:13

标签: vb.net generics inheritance interface casting

我希望实现在模型中比较和排序类的能力。我的模型中的所有对象都需要一些与比较相关的常用功能,因此我创建了一个实现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继承自实现BaseComparer的{​​{1}}。我在这里错过了什么?为什么不能演员呢?我怀疑它与IComparer

有关

2 个答案:

答案 0 :(得分:2)

您的抽象类实现了通用接口IComparer(Of T),但不是非泛型接口 IComparer。这些实际上是两个不同的接口,它们彼此无关,甚至不是继承。

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

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

答案 1 :(得分:2)

有两种不同的界面:

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。