Почему я не могу переписать свой конкретный тип в качестве интерфейса - PullRequest
0 голосов
/ 22 ноября 2011

Я ищу возможность сравнивать и сортировать классы в моей модели. Все объекты в моей модели будут нуждаться в некоторой общей функциональности в отношении сравнений, поэтому я создал реферат 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, который реализует IComparer. Что мне здесь не хватает? Почему это не может быть брошено? Я подозреваю, что это как-то связано с IComparer(Of T)

Ответы [ 2 ]

2 голосов
/ 22 ноября 2011

Существует два разных интерфейса:

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 голосов
/ 22 ноября 2011

Ваш абстрактный класс реализует общий интерфейс IComparer(Of T), но не неуниверсальный интерфейс IComparer. На самом деле это два разных интерфейса, которые не связаны друг с другом даже наследованием.

Вы можете просто сделать так, чтобы ваш абстрактный класс реализовывал оба интерфейса:

Public MustInherit Class BaseComparer(Of T)
    Implements IComparer(Of T), IComparer
End Class
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...