按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!
Thus; some code that iterates the array will need to verify that the array element is not Nothing。
The sample code generates the structure illustrated in Figure 8…2。
Figure 8…2。 Array structure of referenced elements
Figure 8…2 reveals a very important aspect of reference types: an array holds a reference to
the object and not the value of the object。 If the array were value types; then the entire value
would be stored in the array。
The array could just as easily have been some object with a number of variables; like this:
Class MyTypeArray
Public Element1 As MyType
Public Element2 As MyType
。 。 。
End Class
Since array elements are a bunch of references stored in a type; you could make use of this
knowledge to create a type that serves no other purpose than referencing a list of elements;
more monly called a linked list。
In a linked list; the individual objects are linked together and reference another element
nearby。 A doubly linked list will only ever hold references to two other objects: the next one and
the previous one。 (Another type is a singly linked list; which holds a reference to only one other
object: the next one。)
In a doubly linked list; the type will have data members named NextItem and PrevItem。
Each of these data members is used to reference another element in the list; as illustrated in
Figure 8…3。 To iterate a list; you start from either the left or right side and then go to the NextItem
or PrevItem data members; respectively。 Here is an example:
Dim curr As MyType = GetHeadOfList()
Do While (curr IsNot Nothing)
' Do something with curr
curr = curr。NextItem
Loop
…………………………………………………………Page 228……………………………………………………………
206 CH AP T E R 8 ■ L E A R N IN G AB OU T CO M P O N E N TO R IE N T E D AR C HI TE CT U R E
Figure 8…3。 Structure of doubly linked list
As you can see; you can easily add elements to linked lists。 The drawback is that it is expensive
to find a particular object; as that requires iterating through the list。
■Note For the most part; you will be using the standard List class; but there is also a LinkedList
class。 If you’re interested; you can find information about the version of System。Collection。
Generics。LinkedList in the MSDN documentation。 We’ll make our own linked list to demonstrate Visual
Basic programming techniques; but you should use the standard collection classes in almost every case。
For our application’s kernel; we’ll use a doubly linked list to link together a number of
rooms into a set of groupings。
Creating a Linked List
The initial structure of the BaseLinkedListItem class is as follows (defined in LibLightingSystem):
Public MustInherit Class BaseLinkedListItem
Private _next As BaseLinkedListItem
Private _prev As BaseLinkedListItem
Public ReadOnly Property NextItem() As BaseLinkedListItem
Get
Return _next
End Get
End Property
Public ReadOnly Property PrevItem() As BaseLinkedListItem
Get
Return _prev
End Get
End Property
End Class
BaseLinkedListItem is declared as MustInherit to indicate that using this class implies that
you must derive a class。 PrevItem and NextItem are Visual Basic properties that can only read
the values of the private data members of _prev and _next。
…………………………………………………………Page 229……………………………………………………………
C H AP TE R 8 ■ L E AR N IN G AB O U T CO M P O N E N T O R IE N TE D A R CH I TE C TU R E 207
Inserting and Removing Linked List Items
Inserting an object into a linked list or removing an object from a linked list requires some
careful coding。 You need to make sure that the actions will not corrupt the list。 This is not a task
that you want to delegate to the users of the linked list; as they could unintentionally corrupt
the list。 The following is the code to insert and remove an object from a linked list; and is part
of the BaseLinkedListItem class。
Public Sub Insert(ByVal item As BaseLinkedListItem)
item。_next = _next
item。_prev = Me
If _next IsNot Nothing Then
_next。_prev = item
End If
_next = item
End Sub
Public Sub Remove()
If _next IsNot Nothing Then
_next。_prev = _prev
End If
If _prev IsNot Nothing
_prev。_next = _next
End If
_next = Nothing
_prev = Nothing
End Sub
The Insert() method assumes that you want to insert an object into the head of a list; which
has at least one element。 The Insert() method assumes the following code at a minimum。
Dim singleElement As BaseLinkedListItem = GetHeadOfList()
Dim anotherElement as BaseLinkedListItem = CreateListElement()
singleElement。Insert(anotherElement)
The first step is to assign the data members (_next; _prev) of the object ( item) that is going
to be added to the list。
■Note Notice how in the Insert() method; it is possible to assign the private data members of another
object instance。 You learned that private scope means that only the declared type can read private properties
and methods。 This rule has not been violated; because the rule implies types can read the private data members
and private methods of other instances