When you ignore your inheritance, you will have trouble with your parents
TL;DR: Subclasses should honor ALL their parentโs contract.
Problems ๐
- Wrong abstraction
- Subclassification for code reuse
- Misleading hierarchy
- Unused or overridden methods
- Unnecessary complexity
- Liskov Principle Violation
- Maintenanabiilty
- YoYo Hierachies
- Concrete classes subclassified
Solutions ๐
- Favor composition over inheritance
- Don't subclassify for code reuse
- Rethink hierarchy
- Extract shared logic
- Use interfaces
- Remove dead code
Refactorings โ๏ธ
Refactoring 007 - Extract Class
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.");
}
}
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());
}
}
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 |
---|---|
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 ๐ฉโโค๏ธโ๐โ๐จ
Code Smell 11 - Subclassification for Code Reuse
Code Smell 43 - Concrete Classes Subclassified
More Information ๐
Disclaimer ๐
Code Smells are my opinion.
Credits ๐
Photo by Hanson Lu on Unsplash
Favor object composition over class inheritance.
Erich Gamma
Software Engineering Great Quotes
This article is part of the CodeSmell Series.
How to Find the Stinky Parts of your Code