Where possible, I've found it effective to keep system components small and reusuable (each component should have one purpose and do that thing very well) instead of building monolothic objects. Complexity of system components increases exponentially with size.
Keeping components small increases the resilience of the system. Also, from an OO perspective, shoehorning components into a strict hierarchy can lead to unnecessary coupling and rework. In practice, it may be better to fork a small component. YMMV