梓囚徒貧圭�鮗� ○ 賜 ★ 辛酔堀貧和鍬匈��梓囚徒貧議 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