2009-04-27 36 views
5

Tôi muốn triển khai lớp xếp hàng ưu tiên. Khi một mục được thêm ở mức độ ưu tiên cao hơn, nó sẽ được đẩy lên phía trước của hàng đợi thay vì thêm vào cuối hàng đợi.Câu hỏi kế thừa từ Danh sách (của T) lớp

vài dòng đơn giản mã

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 

Bây giờ chức năng gọi điện thoại cố gắng tìm ra các yếu tố trong hàng đợi như vậy ....

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

.....

chương trình in ra 0! Nếu thêm thuộc tính Count() thì mọi thứ đều ổn. Tôi đã nghĩ rằng lớp kế thừa nên gọi hàm Count của lớp cơ sở. Lưu ý rằng Đếm hiển thị trong intellisense ngay cả khi tôi không có thực hiện trong lớp dẫn xuất.

+0

Vui lòng đánh dấu là mã: "dim _q as new PriorityQueue (Of integer) _q.Enque (1) _q.Enque (2) msgbox (_q.Count())" –

Trả lời

7

Vấn đề của bạn là cả hai bạn đều kế thừa từ List(of T) và bạn có thuộc tính cá thể thuộc loại đó, là nơi bạn lưu trữ dữ liệu của mình. Khi Count được gọi trong mã trên của bạn, nó sử dụng thuộc tính Count từ phụ huynh List(of T), không phải nơi bạn lưu trữ dữ liệu của mình.

Ý tưởng tốt hơn là bạn nên kế thừa từ object và có PriorityQueue(of T) triển khai ICollectionIEnumerable(of T) một cách rõ ràng. Bạn không cần phải thay đổi thực hiện nội bộ của bạn cả, bạn sẽ chỉ cần thêm mã để hỗ trợ các giao diện đó.

5

Bạn đang thêm các mục của bạn với một trường hợp danh sách cá nhân (_list.Insert/_list.Add) chứ không phải là danh sách cơ sở (Me.Insert/Me.Add)

Trong thực tế, tôi nghĩ rằng sử dụng một danh sách cá nhân như bạn đang làm và thêm thuộc tính Đếm là thiết kế tốt hơn so với kế thừa từ Danh sách.

Như Adam Robinson chỉ ra, bạn có thể xem xét thực hiện một số hoặc tất cả các IEnumerable < T>, ICollection < T>, ICollection, IEnumerable nếu bạn muốn người dùng của lớp học của bạn để có thể, ví dụ, lặp qua các mục trong hàng đợi.

Điều này là không cần thiết nếu người gọi của bạn chỉ sử dụng nó như một hàng đợi (gọi Enqueue hoặc Dequeue).

Hàng đợi chuẩn xếp hàng Queue < T> triển khai thực hiện IEnumerable < T>, ICollection và IEnumerable thực hiện ít nhất những điều này sẽ tốt cho tính nhất quán.

Các vấn đề liên quan