This applies even when you're trying to create an object. If you have a set of objects, and you want to create an object that corresponds to an object in that set, ask the first object to create the new object. The alternative--testing the object type and creating the second object on that basis--is not extensible when new types of objects are introduced.
Consider video device configuration. Different video devices have different capabilities. For this reason, the user interface for configuring a video device is highly device dependent. Some devices are not frame buffers; to those, concepts like bit depth are meaningless. Rather than query the device to figure out what kind of user interface to use ("Are you a frame buffer? How many bit depths do you have?"), have the video device return a user interface object via a virtual member function. The function can even return an object that can later create that user interface object--a reference surrogate. For more information, see "Surrogate objects" on page 121.
This does not imply that every video device must implement its own user interface. If most devices have common characteristics, Taligent might provide a standard user interface object for most devices to return. This way you can handle devices with special requirements without having to revise the system to know about them.
NOTE Classes used at boot time must be careful about referring to classes that, in turn, refer to things in high-level shared libraries. Using indirect reference objects alleviates that problem.