小牛电子书 > 其他电子书 > VB2008从入门到精通(PDF格式英文版) >

第78章

VB2008从入门到精通(PDF格式英文版)-第78章

小说: VB2008从入门到精通(PDF格式英文版) 字数: 每页3500字

按键盘上方向键 ← 或 → 可快速上下翻页,按键盘上的 Enter 键可回到本书目录页,按键盘上方向键 ↑ 可回到本页顶部!
————未阅读完?加入书签已便下次继续阅读!




wanted to add an element into the list。 



If _roomGroupings Is Nothing Then 

    _roomGroupings = NewRoomGroup() 

Else  

    _roomGroupings。Insert(NewRoomGroup()) 

End If 



     The code that uses the placeholder is shorter and simpler; however; it also requires a dangling  

instance of RoomGrouping that has no real value。 I chose the dangling approach because I am  

making the decision that a room grouping with no identifier is the default room grouping。 



Adding a Room Grouping 



The following code adds a room grouping (added to the class  LightingController)。 



    Public Function AddRoomGrouping(ByVal description As String) As Object 

        Dim grouping As RoomGrouping = New RoomGrouping() _ 

        With { _ 

              。Description = description; _ 

              。Rooms = Nothing 

             } 

        _roomGroupings。Insert(grouping) 

        Return grouping 

    End Function  


…………………………………………………………Page 236……………………………………………………………

214       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 



                To add a new room grouping; you instantiate RoomGrouping; assign the data members; and  

           then call the method _roomGroupings。Insert() to insert the new room grouping into the linked list。 

                Let’s look at the technique for assigning data members; called object initialization。 In  

           previous examples; when an object was instantiated and we wanted to assign default values;  

           we would create a constructor with the appropriate parameters。 However; another way is to instan

           tiate the object and define a block that assigns the appropriate data members or properties。 In the  

           case of RoomGrouping; there are two publicly defined data members: Description and Rooms:  



                          。Description = description; _ 

                          。Rooms = Nothing 



                The Description and  Rooms data members have assign access; which is important as this  

           technique only works with properties that are not read…only。 To assign a data member or prop

           erty; after the object instantiation; add the With keyword; and then within curly brackets; assign  

           each individual data member using a key/value pair; in this form: 



           With { 。Key1 = value1; 。Key2 = value2 } 



                 The key represents the data member property to assign; and the value is the data that is  

           assigned to the data member or property。 In the form example; the properties Key1 and  Key2  

           are set。 

                Another technique of interest in the code to add a room grouping is the definition of a data  

           handle when passing information: 



               Return grouping 



                In the implementation of AddRoomGrouping(); the variable grouping is assigned an  

           instance of RoomGrouping。 The declaration of the RoomGrouping class limits its scope to the  

           LibLightingSystem assembly only; while the declaration of  LightingController is public。 If the  

           method AddRoomGrouping() had attempted to return an instance of RoomGrouping; the piler  

           would have marked this as an error; because the scope is inconsistent。 Assuming for the moment  

           that you did want to return an instance of RoomGrouping; your only solution would be to declare  

           RoomGrouping as public。 The declaration change is the wrong solution; because RoomGrouping is  

           a class without declared methods (other than the base class methods) and has public data  

           members。 It is a class for a specific purpose and should not be shared。 

                Declaring RoomGrouping as public is the wrong approach; so another solution is needed。  

           You could add a counter data member to the  RoomGrouping declaration and return an Integer  

           value indicating the RoomGrouping instance you are referring to in the list。 However; that would  

           mean having access to the list somewhere; and then needing to iterate to find the appropriate  

           RoomGrouping instance。 

                The solution is to declare the method as returning a type Object。 When you use Object;  

           you are defining that your method is giving you an object instance。 The caller may or may not  

           know what the instance type is; and in the case of AddRoomGrouping(); it doesn’t。 But that is fine;  

           because you; as the user; will consider the instance as a key that is managed by the class  

           LightingController。 In technical jargon; the object instance is a handle that you hold and pass  

           to some other ponent that knows what to do with it。 In the example; it means giving the  

           handle to  LightingController because it knows that the handle is an instance of RoomGrouping。  


…………………………………………………………Page 237……………………………………………………………

                             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 215 



■Note  Handles were very popular in the C programming days and were consider pointers to memory。 The  

caller did not know what the pointer pointed to; but kept using it when interacting with an API。 These days;  

handles have lost significance as we have objects;  generics; and other programming constructs。 However; at  

times; handles are very useful。 They can help you to avoid the problem of having to expose the internal state  

of your API; while not having to maintain an object hierarchy to watch which objects are being referenced。 



Finding a Room Grouping 



When a number of room groupings have been added; you will want to find a room grouping  

with a particular description。 As room groupings are a doubly linked list; it means needing to  

iterate the list; as follows (added to  LightingController): 



    Public Function FindRoomGrouping(ByVal description As String) As Object 

        Dim curr As RoomGrouping = _roomGroupings。NextItem 

        Do While curr IsNot Nothing 

            If curr。Description。pareTo(description) = 0 Then 

                Return curr 

            End If 

            curr = TryCast(curr。NextItem; RoomGrouping) 

        Loop 

        Return Nothing 

    End Function 



     In the iteration code; the iteration is similar to the code illustrated earlier in the “Storing a  

Collection Using a Linked List” section。 The one difference is that the curr variable is of type  

RoomGrouping; and because NextItem is of type BaseLinkedListItem; a type cast is necessary。  

Then an iteration using a While loop is carried out; during each iteration; a test paring  

curr。Description to the parameter description is made。 If an object is found; the handle to  

the RoomGrouping is returned; and if nothing is found; Nothing is returned; indicating that the  

RoomGrouping could not be found。 

     This method would be used as follows: 



Dim foundHandle As Object = controller。FindRoomGrouping(〃description〃) 



     Visual Basic has constructs that make it possible to convert the  LightingController class  

into a class that has array functionality。 The following method in LightingController declares  

array…like functionality; which is called a default property 



Default Public ReadOnly Property Item(ByVal description As String) As Object  

    Get  

        Return FindRoomGrouping(description) 

    End Get 

End Property 



     A Visual Basic default property is defined like a property; except that the property is prefixed  

with a Default keyword。 The default property is named  Item by convention; and this name is  

used by all  collection classes for consistency。 The implementation of a property is just like  


…………………………………………………………Page 238……………………………………………………………

216       CH AP T E R   8   ■    L E A R N IN G

返回目录 上一页 下一页 回到顶部 2 2

你可能喜欢的