object composition
Megjelenés
Főnév
object composition (tsz. object compositions)
- (informatika) A composition (kompozíció) az objektum-orientált programozás egyik alapvető elve. A C++-ban az objektum kompozíció azt jelenti, hogy egy osztály egy másik osztály példányát tagváltozóként tartalmazza, és ő maga felelős annak létrehozásáért és életciklusáért. Ez erős „has-a” kapcsolat, ahol a tartalmazott objektum a tartalmazó részének tekintendő.
🧱 Kompozíció jellemzői
- Erős kapcsolat: a komponált (tartalmazott) objektum az egész része.
- A komponált objektum a tartalmazó objektummal együtt jön létre és szűnik meg.
- A tartalmazott objektum tipikusan érték szerint (nem pointerként) szerepel.
- A tartalmazó osztály teljes felelősséggel tartozik a komponált objektumért.
🧩 Példa: Kompozíció C++-ban
#include <iostream>
using namespace std;
class Engine {
public:
void start() const {
cout << "Engine started." << endl;
}
};
class Car {
private:
Engine engine; // Kompozíció: Car birtokolja az Engine-t
public:
void start() {
cout << "Car starting..." << endl;
engine.start(); // Eléri a komponált objektumot
}
};
int main() {
Car myCar;
myCar.start();
}
Ebben a példában:
- A
Carautomatikusan létrehozza azEnginepéldányt. - Ha a
Carpéldány megszűnik, azEngineis automatikusan megsemmisül. - A
CarésEngineközött szoros életciklus-kötés van → kompozíció.
🆚 Kompozíció vs Aggregáció
| Tulajdonság | Kompozíció | Aggregáció |
|---|---|---|
| Kapcsolat típusa | Szoros (erős tulajdonlás) | Laza (használat, nem birtoklás) |
| Objektum példányosítása | Belül (érték szerint) | Kívülről átadott (pointer/reference) |
| Életciklus | Együtt jön létre és szűnik meg | Független életciklus |
| Felelősség | Tartalmazó objektumé | Külső, hívó oldali |
| Példa | Engine engine; |
Engine* engine; vagy Engine& e; |
🛠 Kompozíció és inicializálás
A komponált objektumokat a tartalmazó osztály konstruktor inicializáló listájában érdemes inicializálni:
class Car {
private:
Engine engine;
public:
Car() : engine() {} // engine példányosítása az inicializáló listában
};
Ha az Engine nem rendelkezik alapértelmezett konstruktorral, akkor kötelező is megadni:
class Engine {
int horsepower;
public:
Engine(int hp) : horsepower(hp) {}
};
class Car {
Engine engine;
public:
Car() : engine(150) {} // Megadjuk az Engine példányosítását
};
🎯 Miért előnyös a kompozíció?
- Egyszerű életciklus-kezelés: nem kell törölni, elég ha a gazda objektum megszűnik.
- Jobb kapszulázás: a komponált objektum privát, csak a tartalmazón keresztül elérhető.
- Erős logikai kapcsolat: a részek nem értelmezhetők a „teljes” objektum nélkül.
- Biztonságosabb memóriahasználat: nem kell manuálisan foglalkozni a memóriakezeléssel.
💡 Tipikus példák
Egy
Houseosztály tartalmazhatRoomobjektumokat:class Room { /* ... */ }; class House { Room livingRoom; Room kitchen; };
Egy
Bookosztály tartalmazhatPageobjektumokat.Egy
Personosztály tartalmazhatNameobjektumot, vagyAddressobjektumot.
🧠 Kompozíció a „prefer composition over inheritance” elv része
A modern C++ programozásban gyakori ajánlás:
„Inkább használj kompozíciót, mint öröklést”
Miért?
- Az öröklés szoros és merev kapcsolat.
- A kompozíció rugalmas, dinamikusan változtatható, és jobb újrafelhasználhatóságot nyújt.
- A kompozícióval modulárisan felépített osztályok jönnek létre → jobb karbantarthatóság.
⚠️ Hibák, amiket el kell kerülni
- Ne próbáld a kompozíciót pointerrel vagy dinamikus memóriával utánozni, hacsak nem muszáj → ez inkább aggregációhoz hasonlít.
- Ne tegyél túl sok dolgot a komponált objektumokba – tartsd őket egyszerű és koherens egységeknek.
🧾 Összefoglalás (TL;DR)
- A kompozíció egy erős, szoros kapcsolat két osztály között.
- A tartalmazó osztály teljes kontrollal és felelősséggel bír a komponált objektum felett.
- Hasznos, ha a komponált objektum logikailag az egész része.
- Biztonságosabb és rugalmasabb, mint az öröklés sok esetben.
- A modern objektum-orientált tervezés egyik leggyakrabban ajánlott mintája.
- object composition - Szótár.net (en-hu)
- object composition - Sztaki (en-hu)
- object composition - Merriam–Webster
- object composition - Cambridge
- object composition - WordNet
- object composition - Яндекс (en-ru)
- object composition - Google (en-hu)
- object composition - Wikidata
- object composition - Wikipédia (angol)