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