Синтаксис VB.NET для создания экземпляров унаследованного SortedDictionary с Custom Comparer - PullRequest
0 голосов
/ 11 сентября 2018

Вот моя отправная точка: SortedDictionary с пользовательским Comparer:

Dim dict As SortedDictionary(Of Long, Object) = New SortedDictionary(Of Long, Object)(New CustomComparer())

Чтобы реализовать дополнительные функции, мне нужно расширить словарь, чтобы у меня было следующее:

Public Class CustomDict
    Inherits SortedDictionary(Of Long, Object)
End Class

Dim dict As CustomDict = New CustomDict

Все хорошо до этого момента. Теперь мне просто нужно добавить свой собственный компаратор:

Dim dict As CustomDict = New CustomDict()(New CustomComparer())

Но компилятор считает, что я пытаюсь создать двумерный массив.

В результате, если я использую класс, который расширяет SortedDictionary, я получаю ошибки компилятора при использовании пользовательского компаратора, потому что он думает, что я пытаюсь создать массив. Я ожидаю, что он распознает код как экземпляр класса, который наследует SortedDictionary, и использует для этого пользовательский компаратор.

Подводя итог, это составляет:

Dim dict As SortedDictionary(Of Long, Object) = New SortedDictionary(Of Long, Object)(New CustomComparer())

в то время как это приводит к ошибкам компилятора, связанным с двумерными массивами:

Public Class CustomDict
    Inherits SortedDictionary(Of Long, Object)
End Class

Dim dict As CustomDict = New CustomDict()(New CustomComparer())

Мой синтаксис неверен? Или есть настройка Visual Studio (2017 Professional), чтобы уточнить для компилятора, каково мое намерение? Любая помощь будет оценена.

1 Ответ

0 голосов
/ 11 сентября 2018

При наследовании класса все, кроме его конструкторов, наследуется. Поэтому вы должны создать конструктор самостоятельно и заставить его вызывать конструктор базового класса:

Public Class CustomDict
    Inherits SortedDictionary(Of Long, Object)

    'Default constructor.
    Public Sub New()
        MyBase.New() 'Call base constructor.
    End Sub

    Public Sub New(ByVal Comparer As IComparer(Of Long))
        MyBase.New(Comparer) 'Call base constructor.
    End Sub
End Class

В качестве альтернативы, если вы всегда хотите использовать один и тот же компаратор для своего пользовательского словаря, вы можете пропустить второй конструктор и вместо этого заставить конструктор по умолчанию указать, какой компаратор использовать:

Public Sub New()
    MyBase.New(New CustomComparer())
End Sub
...