OOP teoreticky: Metody a vlastnosti

…aneb krásnější už to být nemůže!
29. 12. 2008

Objekt nemusí pouze uchovávat informace, jak jsme si ukazovali v minulém příkladu. N to bychom objekty vůbec nepotřebovali, vystačili bychom si jen s nějakými strukturami. Síla objektů je v tom, že mohou obsahovat obslužné funkce, kterým se říká metody. Tyto metody pak mohou měnit stav objektu. V předchozích příkladech jsem zmínil krásnou funkci, která manipuluje s objektem a mění jeho vnitřní stav. Byla to metoda Posun(). Co má tato metoda dělat? Bude přebírat dva číselné argumenty a jednoduše posune souřadnice bodu o zadané délky. Implementace:

   1: class Bod
   2:  {
   3:      public int X;
   4:      public int Y;
   5:  
   6:      public void Posun(int PosunX, int PosunY)
   7:      {
   8:          X += PosunX;
   9:          Y += PosunY;
  10:      }
  11:  }

Mělo by být vcelku jasné, jak to funguje. Jen bych rád zdůraznil, že všechny metody v dané třídě mohou pracovat s proměnnými, které ten objekt má. Na osmém řádku předchozího kódu tedy metoda Posun() manipuluje s proměnnou X, kterou jsme deklarovali na třetím řádku. Každá metoda do těchto proměnných vidí a může je měnit, pokud to nějak nezakážeme, ale o tom potom.

A kuš, už těm proměnným X a Y nebudeme říkat proměnné, ale vlastnosti či sloty. V céčkových jazycích je běžnější označení Vlastnost, ale v jiných jazycích se můžeme setkat i s jiným označením, třeba slot. Občas to budu míchat, někdy mi přijde příhodnější to, jindy ono. Já vím, nešvar. Takže obecně řečeno, objekt má různé vlastnosti, náš objekt Bod má dvě vlastnosti: X a Y. Takový objekt Hráč by mohl mít třeba vlastnost Jméno. Objekt Manažer by mohl mít slot pro uchování Hrací desky, na které se hraje a také slot, ve kterém si bude uchovávat Rozhodčího, který zná pravidla hry.

Metody jsou zpravidla funkce, které nějak manipulují s vlastnosti daného objektu. Buď si jen přečte data z vlastností a vrátí nějakou zajímavou informaci, například v jakém kvadrantu Bod leží, nebo může přímo manipulovat a měnit vlastnost objektů. To je příklad naší metody Posun(), která mění hodnoty obou vlastností.

Trochu teoretičtěji řečeno s objektem pracujeme pomocí zpráv. Objekt už si na to reaguje po svém, to je jeho věc, jak daný problém vyřeší (a je to problém programátora, jak to naprogramuje). My například pošleme objektu zprávu „hele kémo, hejbni tím svým líným zadkem a posuň se“ a objekt na to zareaguje „jasná páka, kémo“ a posune se. Jakožto uživatele nějaké třídy nás nezajímá jak to provede. Pokud budeme chtít, aby se náš bod posunul třeba o +10 pixelů na ose x, jednoduše pošleme objektu zprávu a předáme příslušné parametry:

   1: public static void Main()
   2: {
   3:     Bod bod = new Bod();
   4:  
   5:     Console.WriteLine("Bod před posunutím: [{0}, {1}]", bod.X, bod.Y);
   6:  
   7:     bod.Posun(10, 0);
   8:  
   9:     Console.WriteLine("Bod po posunutí: [{0}, {1}]", bod.X, bod.Y);
  10:  
  11:     Console.Read();
  12:  
  13:     /*
  14:      * Program vypíše:
  15:      * Bod před posunutím: [0, 0]
  16:      * Bod po posunutí: [10, 0]
  17:      */
  18: }

Jako uživatelé dané třídy se už nestaráme o to, jak je obslužná metoda implementována, pro nás už je to černá bedna, do které nevidíme a ani vidět nechceme. Zkrátka objekt se umí posouvat, tak toho využijeme. Všimněte si hezké maličkosti. Pokud změníme reprezentaci souřadnic z čísel třeba na písmena (namísto [1, 2] –> [a, b]), stačí když jen upravíme metodu Posun(), aby si čísla, která dostane v argumentech, převedla na písmena a pak nějak dále zpracovala. Jakékoliv výskyty volání metody Posun() můžou zůstat nezměněny. Jinou část kódu zkrátka vůbec nemusíme přepisovat. To je docela hezké, ne?