Вопрос, унаследованный от класса List (of T) - PullRequest
5 голосов
/ 27 апреля 2009

Я хочу реализовать приоритетный класс очереди. Когда элемент добавляется с более высоким приоритетом, он помещается в начало очереди, а не в конец очереди.

Простые несколько строк кода

Public Class PriorityQueue(Of T)
    Inherits List(Of T)

    Private _list As New List(Of T)

    Public Sub Enque(ByVal item As T, Optional ByVal pushToFront As Boolean = False)
        If pushToFront = True Then
            _list.Insert(0, item)
        Else
            _list.Add(item)
        End If
    End Sub
    Public Function Deque() As T
        If _list.Count <> 0 Then
            Dim item As T = _list(0)
            _list.RemoveAt(0)
            Return item
        Else
            Throw New InvalidOperationException
        End If
    End Function
   End Class

Теперь вызывающая функция пытается найти элементы в очереди, таким образом, ....

dim _q as new PriorityQueue(Of integer)
_q.Enque(1)
_q.Enque(2)
msgbox(_q.Count())

.....

программа выводит 0! Если добавить свойство Count (), то все в порядке. Я бы подумал, что унаследованный класс должен вызывать функцию Count базового класса. Обратите внимание, что Count отображается в intellisense, даже если у меня нет реализации в производном классе.

Ответы [ 2 ]

7 голосов
/ 27 апреля 2009

Ваша проблема в том, что вы оба наследуете от List(of T), и у вас есть свойство экземпляра этого типа, в котором вы храните свои данные. Когда в приведенном выше коде вызывается Count, он использует свойство Count вашего родителя List(of T), а это не то место, где вы храните свои данные.

Лучше было бы унаследовать от object и PriorityQueue(of T) реализовать ICollection и IEnumerable(of T) явно. Вам вообще не нужно менять свою внутреннюю реализацию, вам просто нужно добавить код для поддержки этих интерфейсов.

5 голосов
/ 27 апреля 2009

Вы добавляете свои элементы в личный экземпляр списка (_list.Insert / _list.Add), а не в базовый список (Me.Insert / Me.Add)

На самом деле я думаю, что использование личного списка, как и вы, и добавление свойства Count - лучший дизайн, чем наследование от List.

Как указывает Адам Робинсон, вы можете рассмотреть возможность реализации некоторых или всех IEnumerable , ICollection , ICollection, IEnumerable, если вы хотите, чтобы пользователи вашего класса могли, например, выполнять итерации по элементам в очередь.

Это не является строго необходимым, если ваши абоненты используют его только как очередь (вызов Enqueue или Dequeue).

Стандартный класс очереди Queue реализует IEnumerable , ICollection и IEnumerable, реализуя, по крайней мере, это было бы хорошо для согласованности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...