The hierarchy of channels derives from the single interface
IChannel. By itself, IChannel is not particularly interesting
because it doesn't introduce any new methods for communication.
Each channel shape, such as IInputChannel or
IDuplexSessionChannel, has its own interface derived from
IChannel that describes the capabilities and semantics of the
channel.  When you write a channel, you may support variations
of your channel for many different channel shapes. For example,
you may support both an IInputChannel and an IOutputChannel
variation for sending and receiving. Or, you may support both an
IDuplexChannel and IDuplexSessionChannel variation depending on
whether sessionful communication is needed. During the channel
build process, your channel factory or listener will be asked to
supply a single particular variation of IChannel. Since the
variation is part of the generic contract, the concrete channel
implementation that gets returned by the channel factory or
listener must support the specified interface