The definition of an interface that indicates that the controller should do nothing is as follows (in the controller library LibLightingSystem): Public Interface INoRemoteControlRoom Inherits IRoom End Interface As you can see; INoRemoteControlRoom lacks methods and properties; like our placeholder interface IRoom。 However; in this case; there are no methods or properties because the kernel system does not require them。 The idea behind the INoRemoteControlRoom interface is to indicate that the type implementing the interface is a room; but a room that should not be managed by the controller。 Using the bedroom as an example; the implementation is as follows (defined in the Home project): Imports LibLightingSystem Public Class Bedroom Implements INoRemoteControlRoom End Class The definition of the bedroom allows the kernel to use an instance of a room; as follows: Dim rooms As IRoom()= New IRoom(10) { } rooms(0) = New Bedroom() 。 。 。 If TypeOf(rooms(0)) Is INoRemoteControlRoom Then " Take appropriate action End If This code creates an array of rooms and assigns the index 0 to an instance of Bedroom。 The If statement asks if the IRoom instance in index 0 is of type INoRemoteControlRoom。 …………………………………………………………Page 224…………………………………………………………… 202 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 ■Note Using placeholder interfaces and inheritance sets up a very powerful architecture that allows you to create groupings。 You can then filter individual instances based on refinements of the grouping。 All of this is possible in the Visual Basic language using TryCast() and Is; which allow queries of subclassed types of an instance。 The queries are noninvasive and do not cause exceptions to be thrown。 The queries give you the ability to make decisions based on whether an instance would like to be associated with a particular grouping based on an interface。 Defining the IRemoteControlRoom Interface Another type of room is one where the lighting is pletely managed by the controller。 The controller does not seek the input of the room and manages the lighting based on the logic that seems appropriate to it。 For example; a public…viewing area in a museum does not require light at certain times of day。 When the museum is closed and the cleaners are finished; the lights can be turned off。 When the museum is open; the lights are turned on。 This is a simple logic and can be pletely managed by the controller。 The interface for the controlled room is defined as follows (in LibLightingSystem): Public Interface IRemoteControlRoom Inherits IRoom ReadOnly Property LightLevel() As Double Sub LightSwitch(ByVal lightState As Boolean) Sub DimLight(ByVal level As Double) End Interface The only input that IRemoteControlRoom provides is information about whether the light is on; off; or at a certain level。 This is through the LightLevel property。 The LightLevel property is read…only; because the controller and the light level might bee out of sync。 For example; suppose it’s time for the museum to close; and the lights are switched off in the public…viewing area。 But today; the cleaners took a little while longer than usual。 They turn the lights back on so that they can see what they are doing。 The local device can do one of two things: allow the light to be turned on without the approval of the controller; or not allow the light to be turned on; requiring a controller intervention。 The best approach is to allow a local override and let the cleaners turn on the light。 The LightLevel property is necessary so that the controller can verify if the state of the light is what the controller expects it to be。 ■Note When you are defining a kernel; sometimes it is necessary to add functionality into an interface that verifies the state of the implementation。 Because the kernel is not in control of the implementation; the kernel should not assume the state; as the state could change for some reason。 In the case of the lighting system; the change could be due to a cleaner turning on the light after it was turned off。 …………………………………………………………Page 225…………………………………………………………… 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 203 The IRemoteControlRoom methods LightSwitch() and DimLight() turn the light on or off and set the light to a certain level; respectively。 These methods are used to control the state of the implementation。 Defining the ISensorRoom Interface Another type of room is one that can be controlled under certain circumstances。 Let’s go back to the cleaner example where the cleaner turned on the light。 If the controller notices that the light is on; even though it was turned off; should the controller turn off the light? You might say sure; the controller should turn off the light。 However; that is not pletely correct。 Imagine the situation where the cleaner turns on the light and the controller turns it off。 The cleaner would immediately turn the light back on; and the controller would turn it off。 The cleaner would tape the light switch down so that a constant battle of the light going on and off ensues (because this battle is in milliseconds; the light remains on)。 A smarter approach would be to allow a timing of the light。 But how mu