headerphoto

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 <<.