paint-brush
Here's Why You Should Replace Inheritance with Delegationby@mcsee
203 reads

Here's Why You Should Replace Inheritance with Delegation

by Maximiliano Contieri
Maximiliano Contieri HackerNoon profile picture

Maximiliano Contieri

@mcsee

I’m a sr software engineer specialized in Clean Code, Design...

February 17th, 2025
Read on Terminal Reader
Read this story in a terminal
Print this story
Read this story w/o Javascript
Read this story w/o Javascript
tldt arrow

Too Long; Didn't Read

Replace restrictive inheritance hierarchies with flexible object delegation.
featured image - Here's Why You Should Replace Inheritance with Delegation
1x
Read by Dr. One voice-avatar

Listen to this story

Maximiliano Contieri HackerNoon profile picture
Maximiliano Contieri

Maximiliano Contieri

@mcsee

I’m a sr software engineer specialized in Clean Code, Design and TDD Book "Clean Code Cookbook" 500+ articles written

About @mcsee
LEARN MORE ABOUT @MCSEE'S
EXPERTISE AND PLACE ON THE INTERNET.

Transform your rigid inheritance into flexible delegations

TL;DR: Replace restrictive inheritance hierarchies with flexible object delegation

Problems Addressed 🤯

  • Liskov substitution violation
  • Rigid class hierarchy
  • Hidden dependencies
  • Tight Coupling
  • Limited Reusability
  • Single Responsibility principle violation


article preview
HACKERNOON

Code Smell 290 - Refused Bequest | HackerNoon

Subclasses should honor ALL their parent’s contract.

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-iii-t7h3zkv

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xiv

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-vii-8dk31x0

https://hackernoon.com/how-to-find-the-stinky-parts-of-your-code-part-xxv

Steps 🔄

  1. Create a temporary field in the subclass for the superclass.
  2. Update subclass methods to delegate calls.
  3. Add delegation methods for inherited behavior.
  4. Remove inheritance and update object creation.

Sample Code 💻

Before 🚨

class Chatbot {    
    public void respond(String question) {
        // Here is the logic to answer a question
    }
}

class Robot extends Chatbot {
    // The Physical Robot inherits the logic
    // to answer questions
    // and adds physical behavior
    public void move() {
        System.out.println("Moving...");
    }
    
    public void grab() {
        System.out.println("Grabbing object...");
    }
}

After

class Brain {
    public String answer(String question) {
        // The common logic to answer questions
        // is extracted into a different object
        return "Thinking... Answering: " + question;
    }
}

final class Chatbot {    
    private final Brain brain;
    
    Chatbot(Brain brain) {
        this.brain = brain;
    }
    
    public void respond(String question) {
        System.out.println(this.brain.answer(question));
    }
}

final class Robot {
    // 4. Remove inheritance and update object creation.
    private final Brain brain;    
    // 1. Create a temporary field in the subclass for the superclass.
    // private final Chatbot chatbot;  
    
    Robot(Brain brain) {
        this.brain = brain;
        // 2. Update subclass methods to delegate calls.
        // this.chatbot = new Chatbot(brain);
        // This code is removed after step 4
    }
    
    public void move() {
        System.out.println("Moving...");
    }
    
    public void grab() {
        System.out.println("Grabbing object...");
    }
    
    public void respond(String question) {
        // 3. Add delegation methods for inherited behavior.
        // chatbot.respond(question);
        // This code is also removed after step 4 
        System.out.println(this.brain.answer(question));
        // The physical robot can also use it as text-to-speech
    }
}

Type 🛠️

  • Semi-Automatic

Safety 🛡️

This refactoring is safe when done carefully and with proper testing.


You should ensure all delegated method signatures match exactly and maintain existing behavior.


The main risk comes from missing methods that need delegation or incorrectly implementing the delegation methods.

Why is the Code Better? ✨

You gain the flexibility to change implementations at runtime and avoid the pitfalls of inheritance like tight coupling.

How Does it Improve the Bijection?

This refactoring improves the Bijection between code and reality by better modeling real-world relationships.


A robot doesn't inherit from a brain in the real world - it has a brain.


By replacing inheritance with delegation, you create a more accurate representation of the actual relationship between objects using the MAPPER.

Limitations ⚠️

The rewriting requires writing additional delegation methods.


If subclass logic relies too much on the superclass, delegation might increase boilerplate.

Refactor with AI

Without Proper Instructions

With Specific Instructions

ChatGPT

ChatGPT

Claude

Claude

Perplexity

Perplexity

Copilot

Copilot

Gemini

Gemini

DeepSeek

DeepSeek

Meta AI

Meta AI

Tags 🏷️

  • Inheritance


article preview
MAXIMILIANO CONTIERI - SOFTWARE DESIGN

Refactoring 007 - Extract Class

Behavior is repeated across the system. But we are missing a concept

See also 📚


article preview
REFACTORING

Replace Inheritance with Delegation

Problem: You have a subclass that uses only a portion of the methods of its superclass (or it’s not possible to inherit superclass data). Solution: Create a field and put a superclass object in it, delegate methods to the superclass object, and get rid of inheritance.

Credits

Image by Gerd Altmann on Pixabay


This article is part of the Refactoring Series.


L O A D I N G
. . . comments & more!

About Author

Maximiliano Contieri HackerNoon profile picture
Maximiliano Contieri@mcsee
I’m a sr software engineer specialized in Clean Code, Design and TDD Book "Clean Code Cookbook" 500+ articles written

TOPICS

THIS ARTICLE WAS FEATURED IN...

Arweave
Read on Terminal Reader
Read this story in a terminal
 Terminal
Read this story w/o Javascript
Read this story w/o Javascript
 Lite
Hackernoon
X
Threads
Bsky
X REMOVE AD