DEV Community

Cover image for Code Smell 290 - Refused Bequest
Maxi Contieri
Maxi Contieri

Posted on

Code Smell 290 - Refused Bequest

Ignoring your inheritance leads to conflicts with your origins.

TL;DR: Subclasses should honor ALL their parent’s contract.

Problems 😔

Solutions 😃

  1. Favor composition over inheritance
  2. Don't subclassify for code reuse
  3. Rethink hierarchy
  4. Extract shared logic
  5. Use interfaces
  6. Remove dead code

Refactorings ⚙️

Context 💬

When you create a subclass, it should use or extend the behavior of its parent.

If it ignores or overrides most of it, you probably force inheritance where it doesn’t belong to reuse code.

This makes the code misleading and hard to maintain.

Sample Code 📖

Wrong 🚫

class House {
  constructor(address) {
    this.address = address;
  }
  address() {
    return this.address;
  }
  openDoor() {
    console.log("Door opened at " + this.address);
  }
}

class Motorhome extends House {
  constructor() {
    super(null);
  }
  address() {
    return null;
    // This implementation is the same as the parent's
    // and is also a refused bequest
  }
  openDoor() {
    console.log("Motorhome door opened.");
  }
}
Enter fullscreen mode Exit fullscreen mode

Right 👉

class House {
  constructor(address) {
    this.address = address;
  }
  address() {
    return this.address;
  }
  openDoor() {
    console.log("Door opened at " + this.address);
  }
}

class Motorhome {
  // does not inherit from House
  constructor(gps) {
    this.gps = gps;
  }
  openDoor() {
    console.log("Motorhome door opened at " + this.gps.getLocation());
  }
}
Enter fullscreen mode Exit fullscreen mode

Detection 🔍

[X] Manual

Look for subclasses that override or ignore most of their parent’s behavior.

You should reconsider the inheritance if a subclass sets parent properties to null or reimplements core methods.

Tags 🏷️

  • Inheritance

Level 🔋

[X] Intermediate

Why the Bijection Is Important 🗺️

Your software should reflect real-world relationships.

When you force a subclass that doesn’t logically extend its parent in the Bijection, you mislead developers and introduce maintenance problems.

AI Generation 🤖

AI can generate this smell when it defaults to inheritance for reuse instead of composition.

This happens when AI follows generic templates without understanding the context.

AI Detection 🥃

AI can detect this smell by analyzing class structures and inheritance trees. However, it struggles with subtle cases where inheritance initially seems valid but breaks expectations.

Try Them! 🛠

Remember: AI Assistants make lots of mistakes

Without Proper Instructions With Specific Instructions
ChatGPT ChatGPT
Claude Claude
Perplexity Perplexity
Copilot Copilot
Gemini Gemini
DeepSeek DeepSeek
Meta AI Meta AI

Conclusion ✔️

When you design a class hierarchy, you need to make sure that subclasses logically inherit from their parent.

If a subclass refuses some of the behavior, you should rethink your design.

Relations 👩‍❤️‍💋‍👨

More Information 📕

Refactoring Guru

Code Smells

Disclaimer 📘

Code Smells are my opinion.

Credits 🙏

Photo by Hanson Lu on Unsplash


Favor object composition over class inheritance.

Erich Gamma


This article is part of the CodeSmell Series.


SurveyJS custom survey software

Build Your Own Forms without Manual Coding

SurveyJS UI libraries let you build a JSON-based form management system that integrates with any backend, giving you full control over your data with no user limits. Includes support for custom question types, skip logic, an integrated CSS editor, PDF export, real-time analytics, and more.

Learn more

Top comments (0)

The Most Contextual AI Development Assistant

Pieces.app image

Our centralized storage agent works on-device, unifying various developer tools to proactively capture and enrich useful materials, streamline collaboration, and solve complex problems through a contextual understanding of your unique workflow.

👥 Ideal for solo developers, teams, and cross-company projects

Learn more

👋 Kindness is contagious

Please leave a ❤️ or a friendly comment on this post if you found it helpful!

Okay