Vb.net 为什么可以';我把我的具体类型重铸成一个接口

Vb.net 为什么可以';我把我的具体类型重铸成一个接口,vb.net,generics,inheritance,interface,casting,Vb.net,Generics,Inheritance,Interface,Casting,我希望在我的模型中实现比较和排序类的功能。我模型中的所有对象都需要一些关于比较的通用功能,因此我创建了一个抽象的BaseComparer,它实现了IComparer Public MustInherit Class BaseComparer(Of T) Implements IComparer(Of T) End Class Public Class PersonComparer Inherits BaseComparer(Of Person) End Class 模型中的每

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

Public MustInherit Class BaseComparer(Of T)
    Implements IComparer(Of T)
End Class
Public Class PersonComparer
    Inherits BaseComparer(Of Person)
End Class
模型中的每个类都有自己的
BaseComparer
的具体实现

Public MustInherit Class BaseComparer(Of T)
    Implements IComparer(Of T)
End Class
Public Class PersonComparer
    Inherits BaseComparer(Of Person)
End Class
然后我有一个
比较器工厂
,负责创建和初始化比较器:

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)

您的抽象类实现了泛型接口,而不是非泛型接口有关。这实际上是两个不同的接口,它们彼此不相关,甚至不通过继承

您只需让抽象类实现两个接口:

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)

抽象类实现泛型接口,但不实现非泛型接口。这实际上是两个不同的接口,它们彼此不相关,甚至不通过继承

您只需让抽象类实现两个接口:

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)

有两种不同的接口:

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)

i比较程序(http://msdn.microsoft.com/en-us/library/8ehhxeaf.aspx)
后一个泛型接口不继承前者


我建议让您的BaseComparer直接实现非通用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)

i比较程序(http://msdn.microsoft.com/en-us/library/8ehhxeaf.aspx)
后一个泛型接口不继承前者


我建议让您的BaseComparer也直接实现非通用的IComparer。

我认为它们是完全独立的接口是有道理的。出于某种原因,我认为他们在某个地方有着神奇的联系。谢谢我想它们是完全独立的接口是有道理的。出于某种原因,我认为他们在某个地方有着神奇的联系。谢谢我希望我能接受两个答案。谢谢你的帮助。这就是我所缺少的。我希望我能接受两个答案。谢谢你的帮助。这就是我错过的。