嗔秤戻幣�哉膵�云利匈嬉蝕湊蛸賜�塋床四衲���萩晦編報炎嘔囚^泡仟 ̄云利匈�《超噌�殻窟�嵌虜隆輓麈觚翹瀘卉韮�仍仍�。� 烏御危列
浪慕利 卦指云慕朕村 厘議慕尺 厘議慕禰 TXT畠云和墮 序秘慕杏 紗秘慕禰

VB2008貫秘壇欺娼宥(PDF鯉塀哂猟井)-及75嫗

梓囚徒貧圭�鮗� ○ 賜 ★ 辛酔堀貧和鍬匈��梓囚徒貧議 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
卦指朕村 貧匯匈 和匯匈 指欺競何 壘��0�� 家��0��
隆堋響頼��紗秘慕禰厮宴和肝写偬堋響��
梁椣戻幣�� 梁心弌傍議揖扮窟燕得胎��傍竃徭失議心隈才凪万弌誌育断蛍�輌臆惨軼僑〃�燕慕得珊辛參資誼持蛍才将刮襲潜��範寔亟圻幹慕得 瓜寡追葎娼得辛參資誼寄楚署衛、持蛍才将刮襲潜填��