DEV Community

Cover image for Refactoring 023 - Replace Inheritance with Delegation
Maxi Contieri
Maxi Contieri

Posted on • Originally published at maximilianocontieri.com

2

Refactoring 023 - Replace Inheritance with Delegation

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

Related Code Smells 🧑‍💻

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...");
    }
}
Enter fullscreen mode Exit fullscreen mode

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
    }
}
Enter fullscreen mode Exit fullscreen mode

Type 🛠️

[X] 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

Related Refactorings 🔄

See also 📚

Refactoring Guru

Credits

Image by Gerd Altmann on Pixabay


This article is part of the Refactoring Series.

Warp.dev image

Warp is the highest-rated coding agent—proven by benchmarks.

Warp outperforms every other coding agent on the market, and gives you full control over which model you use. Get started now for free, or upgrade and unlock 2.5x AI credits on Warp's paid plans.

Download Warp

Top comments (0)

Build gen AI apps that run anywhere with MongoDB Atlas

Build gen AI apps that run anywhere with MongoDB Atlas

MongoDB Atlas bundles vector search and a flexible document model so developers can build, scale, and run gen AI apps without juggling multiple databases. From LLM to semantic search, Atlas streamlines AI architecture. Start free today.

Start Free

👋 Kindness is contagious

Dive into this thoughtful piece, beloved in the supportive DEV Community. Coders of every background are invited to share and elevate our collective know-how.

A sincere "thank you" can brighten someone's day—leave your appreciation below!

On DEV, sharing knowledge smooths our journey and tightens our community bonds. Enjoyed this? A quick thank you to the author is hugely appreciated.

Okay