Another aspect is the granularity of extensions. An extension contains almost always more than a single object. Usually, an extension adds a subsystem. Proper language support for modules and subsystems can be very helpful to resolve packaging and configuration problems. One of the most important aspects is isolation or encapsulation of an entire subunit, so that interference with other units from other vendors can be controlled statically, i.e. without inspecting the actual merger.
Component software is extensible by definition, i.e. never complete.
While most traditional languages fail to support dynamic polymorphism, many of the object-oriented languages fail to support static encapsulation of units that are comprised of several classes and objects. That is, common object-oriented programming supports some information hiding at the level of classes, but not beyond that. From the above considerations we can draw a set of conclusions. Polymorphism is at the very heart of, and clearly fundamental to, component-orientation. Inheritance of code, however, is not fundamental to the nature of components and in fact should be restricted to maintain manageability.