OOP teoreticky: Třídy a objekty

…aneb není třída jako objekt!
26. prosinec

Zůstaneme u Bodu. Představte si, že máte objekt Bod. Otázka zní – kolik bodů můžeme v programu mít? V zásadě můžeme otázku redukovat na: Potřebujeme více instancí různých Bodů nebo si vystačíme vždy s jedním? Samozřejmě jich potřebujeme více, třeba takový čtverec je tvořen čtyřmi vrcholy, které bychom jistě rádi reprezentovali Body. Takže potřebujeme nějaký mechanismus, který by nám umožnil nadefinovat si, jak má Bod vypadat a následně vytvářet mnoho různých instancí Bodů. Přesně k tomu slouží Třídy a Objekty.

Třída je pouze abstraktní předpis pro to, jak by měl vypadat vzniklý objekt. Ve třídě definujeme, jak má objekt vypadat a objekt samotný je už pak konkrétní instance dané třídy. Zůstaneme u bodu. Pokud řekneme, že Bod je obecně dvojice hodnot X a Y, pak mluvíme o třídě. Pokud teď zrovna budeme chtít pracovat s konkrétním Bodem [1, 5], mluvíme o objektu. Objekt je tedy živá struktura, která byla vytvořena podle vzoru z dané třídy. Asi jako když máte v kuchařce návod na houbovou omáčku (to je třída) a vy pak podle ni uděláte oběd (to je objekt). Chce to kód. Ukázka bude v C#:

   1: class Bod
   2: {
   3:     public int X;
   4:     public int Y;
   5: }

Probereme si, co výše uvedeným kódem vytvoříme. Pomocí klíčového slova class jsme si nadefinovali novou třídu. Tuto třídu jsme pojmenovali Bod a přiřadili jsme k ní dvě proměnné, které reprezentují souřadnice. Tak jak jsme si říkali nahoře. Klíčové slovo int by mělo být jasné, klíčového slova public si prozatím nevšímejte. Předpis pro bod bychom měli, ale potřebovali bychom ještě ten Bod nějak vytvořit. To provedeme za pomoci klíčového slova new. V jiných programovacích jazycích to možná bude jiné, ale ve většině se toto klíčové slovo používá. Vyzkoušíme:

   1: public static void Main()
   2: {
   3:     Bod bod1 = new Bod();
   4:     Bod bod2 = new Bod();
   5: }

Všimněte si, že jsme vytvořili dvě instance třídy Bod. Každá z těchto instancí, bod1 i bod2, ukazují na jiný paměťový blok, nejedná se o stejné proměnné, jsou pouze stejného typu. Asi jako když deklarujete dva Stringy. My víme, že třída Bod má předpis pro hodnoty X a Y. Pomocí tečkové notace (v C#, jinde může být syntaxe jiná, PHP třeba používá operátor –>) se pokusíme těmto proměnným přiřadit hodnotu:

   1: public static void Main()
   2: {
   3:     Bod bod1 = new Bod();
   4:     Bod bod2 = new Bod();
   5:  
   6:     bod1.X = 10;
   7:     bod1.Y = 25;
   8:  
   9:     bod2.X = 50;
  10:     bod2.Y = -10;
  11:  
  12:     Console.WriteLine("Bod1: [{0}, {1}]", bod1.X, bod1.Y);
  13:     Console.WriteLine("Bod2: [{0}, {1}]", bod2.X, bod2.Y);
  14:  
  15:     Console.Read();
  16:  
  17:     /*
  18:      * Program vypíše:
  19:      * Bod1: [10, 25]
  20:      * Bod2: [50, -10]
  21:      */
  22: }

Jak vidíte, skutečně jsme vytvořili dvě různé instance třídy Bod, do kterých můžeme ukládat různé hodnoty. To je docela hezké, ne? Takže třída představuje jakýsi předpis pro datový typ proměnné, objekt představuje konkrétní proměnnou, která vznikne z třídy.