我希望实现在模型中比较和排序类的能力。我的模型中的所有对象都需要一些与比较相关的常用功能,因此我创建了一个实现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
答案 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。