梓囚徒貧圭�鮗� ○ 賜 ★ 辛酔堀貧和鍬匈��梓囚徒貧議 Enter 囚辛指欺云慕朕村匈��梓囚徒貧圭�鮗� ● 辛指欺云匈競何��
!!!!隆堋響頼��紗秘慕禰厮宴和肝写偬堋響��
using in this chapter。 However�察�I¨ll talk about when you might want to implement the kernel as
an interface a little later in the chapter�察�in the ^Defining the Kernel As an Interface Instead of a
Class ̄ section。
The controller represents a building that has the ability to organize rooms into groupings。
Based on the groupings�察�the controller can perform operations such as turning the lights on
or off�察�or setting lights to a specific dimness。 When each of these operations is executed�察�the
controller must respect the intentions of the individual rooms�察�by querying for a particular
interface as defined by the previous section。
The controller has two main responsibilities�此�calling the appropriate interface methods
and organizing the interface instances。 The organization of the instances involves using collec
tions�察�arrays�察�or a linked list。 We¨ll use a linked list in this example。
Storing a Collection Using a Linked List
In the examples in previous chapters�察�we created a collection of objects using an array�察�like this�此�
Dim array As MyType�┌� = New MyType��9�� �� ��
array��0�� = New MyType�┌�
array��2�� = New MyType�┌�
This creates an array that can contain 10 elements at most ��MyType��9����。 If you needed to store
20 elements�察�you would need to use the ReDim keyword with Preserve ��as explained in Chapter 4��。
Another feature of an array is that you don¨t need to assign the elements in a sequential manner。
The example assigns the first and third positions�察�with the second position being Nothing。
´´´´´´´´´´´´´´´´´´´´´´Page 227´´´´´´´´´´´´´´´´´´´´´´´
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 205
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 instance