composition over inheritance
Megjelenés
Főnév
composition over inheritance (tsz. composition over inheritances)
- (informatika) Composition over inheritance (magyarul: kompozíció öröklés helyett) egy szoftvertervezési elv, amely azt ajánlja, hogy új osztályokat más osztályok használatával (komponensekként) építsünk fel, ahelyett, hogy meglévő osztályokat örökölnénk. Ez az elv segít rugalmasabb, újrahasználhatóbb és karbantarthatóbb kódot létrehozni.
🎯 Alapgondolat
- Öröklés (inheritance): „Ez egy olyan” kapcsolat („is-a”)
- Kompozíció (composition): „Ez tartalmaz egy ilyet” kapcsolat („has-a”)
// Öröklés (nem ajánlott, ha csak új viselkedést akarunk)
class Bird { void fly(); }
class Penguin : public Bird { /* problem! Penguins can't fly! */ }
// Kompozíció (helyesebb)
class FlightBehavior { virtual void fly(); }
class CanFly : public FlightBehavior { void fly() override { ... } }
class CannotFly : public FlightBehavior { void fly() override { } }
class Bird {
FlightBehavior* flight;
void fly() { flight->fly(); }
};
🧱 Összehasonlítás
| Jellemző | Öröklés | Kompozíció |
|---|---|---|
| Kapcsolat típusa | “is-a” | “has-a” |
| Újrahasznosíthatóság | Gyenge | Erős |
| Rugalmasság | Statikus (fordításkor) | Dinamikus (futásidőben cserélhető) |
| Kód újrahasználat | Alosztály struktúrában | Modulokon keresztül |
| Többféle viselkedés | Nehézkes, többszörös örökléssel | Könnyen cserélhető viselkedés |
🛠️ Példa (C++)
// Kompozíció: új viselkedés funkcióval, nem örökléssel
class Engine {
public:
void start() { std::cout << "Engine starts\n"; }
};
class Car {
private:
Engine engine; // has-a relationship
public:
void drive() {
engine.start(); // delegálás
std::cout << "Car drives\n";
}
};
Itt a Car nem örökli az Engine-t, csak használja annak képességeit – ami jóval jobb megoldás, mint egy „Car is an Engine” logikát erőltetni.
🧩 Előnyök
- ✅ Laza csatolás: a komponensek könnyebben cserélhetők
- ✅ Jobb kódújrahasznosítás: ugyanaz a komponens több objektumban használható
- ✅ Egyszerűbb tesztelés és karbantartás
- ✅ Öröklési problémák (pl. diamánt öröklés) elkerülése
⚠️ Mikor NE használj kompozíciót?
- Ha valóban természetes „is-a” kapcsolat van (pl.
Circleörökli aShape-et) - Ha az öröklés nem növeli a bonyolultságot és nem okoz viselkedési hibákat
📚 Gyakorlati alkalmazások
- Strategy pattern – különböző viselkedések kompozíción keresztüli cseréje
- Decorator pattern – futásidejű funkcionalitásbővítés kompozícióval
- Dependency injection – objektumok összeállítása kívülről (összetett kompozíció)
🧠 TL;DR
A composition over inheritance elv azt javasolja, hogy ne örököljünk új funkciókért, hanem komponensekből állítsuk össze az objektumokat. Így kódunk rugalmasabb, karbantarthatóbb és újrahasználhatóbb lesz, különösen komplex rendszerek esetén.
- composition over inheritance - Szótár.net (en-hu)
- composition over inheritance - Sztaki (en-hu)
- composition over inheritance - Merriam–Webster
- composition over inheritance - Cambridge
- composition over inheritance - WordNet
- composition over inheritance - Яндекс (en-ru)
- composition over inheritance - Google (en-hu)
- composition over inheritance - Wikidata
- composition over inheritance - Wikipédia (angol)