Kompozice v OOP
Objektová kompozice (tj. složení, skládání) nám umožňuje v OOP kombinovat jednoduché objekty nebo vytvářet složitější datové struktury. Kompozice je technika, kdy využijeme instanci jedné třídy v jiné třídě.
Obsahuje-li definice třídy členské proměnné objektového typu, pak se jedná o kompozici objektů. Pro přístup k vlastnostem objektu "zakomponované" třídy použijeme její členské funkce.
Kompozice vytváří hierarchii objektů tím, že skládá objekty. Popisuje vtah typu "má" ("has"). Dědičnost vytváří odvozené třídy, popisuje strukturu typu "je" ("is a"). Příklad: osobní auto "je" vozidlo, vozidlo "má" kola.
Objektová kompozice je taky důležitý nástroj pro vytváření pokročilých datových struktur např. pole nebo spojového seznamu.
Kompozici si ukážeme na příkladu tříd Klient a Datum: klient má datum narození.
//DEFINICE TŘÍDY Datum
class Datum {
private:
int Den, Mesic, Rok;
public:
Datum(): Den(1), Mesic(1), Rok(1950){}
bool jePlatneDatum() const;
// Přístupové metody
int dejDen() const { return this->Den; }
int dejMesic() const { return this->Mesic; }
int dejRok() const { return this->Rok; }
void nastavDen(int d) { this->Den = d; }
void nastavMesic(int m) { this->Mesic = m ; }
void nastavRok(int r) { this->Rok = r; }
void nastavDatum (int d, int m, int r);
// Další metody
void vypisDatum() const; //výpis ve formátu dd.mm.rrrr
};
Třída Klient obsahuje členskou proměnnou třídy Datum. Objekt třídy Klient nemá všechny vlastnosti a metody třídy Datum, ale má k nim přístup prostřednictvím jejich metod.
//DEFINICE TŘÍDY Klient
class Klient {
private:
int Id;
string Jmeno;
string Prijmeni;
Datum datumNarozeni;
public:
Klient();
// Přístupové metody
string dejJmeno() const { return this->meno; }
string dejPrijmeni() const { return this->Prijmeni; }
Datum dejDatumNarozeni() const { return this->datumNarozeni; }
// Další metody
void vypisKlienta() const ;
};
Pricippy použití kompozice nejlépe vidíme u členských metod, určených pro výpis informací o objektech dané třídy na monitor. V metodě vypisKlienta() můžeme jednoduše vypsat číslo, jméno a příjmení klienta. K výpisu jeho data narození musíme použít metody třídy Datum, a to dejDen(), dejMesic(), dejRok() nebo nejlépe metodu vypisDatum().
void Datum::vypisDatum() const {
cout << this->Den << "." << this->Mesic << "." << this->Rok;
}
void Klient::vypisKlienta() const {
cout << this->Id << "." << this->Jmeno << " " << this->Prijmeni << " ";
cout << this->datumNarozeni.dejDen() << "." << this->datumNarozeni.dejMesic() << "." << this->datumNarozeni.dejRok() ;
//nebo lepe:this->datumNarozeni.vypisDatum();
}
V obou třídách můžeme místo metod pro výpis použít přetížený operátor <<.