Symptom

A subclass inherits methods or fields it doesn't actually use — overriding to no-ops, throwing 'unsupported', or just ignoring the inheritance.

Goal

Sharing happens through composition (a delegate object) rather than forced inheritance.

Smellier version

class Animal { fly() {} swim() {} }
class Dog extends Animal {
fly() { throw new Error('no'); }
}

Fresher version

class Dog {
// composes a Mover delegate that knows it's a swimmer
}
Example source: Illustrative example written for this site, not a quotation from any source.
Pressure

Liskov violations: callers can't trust subclass instances to honor the parent contract; polymorphism becomes a trap.

Tradeoff

Replacing inheritance with composition is more verbose at construction sites and removes the syntactic polymorphism inheritance provided; consumers that rely on `instanceof` checks or shared base methods need explicit migration.

Relief

Each class has only what it needs; surprises in polymorphic use disappear.

Trap

Replacing every inheritance relationship with composition, including ones where the Liskov contract genuinely holds — pays construction-site verbosity for no real fit improvement.