3. ročník
Objekt základní prvek v OOP má vlastnosti charakterizují objekt (barva, počet osob) má metody definují to, co objekt umí (vypni motor, připoj se) vznikne vytvoření nové instance definován pomocí třídy
Zapouzdření jeden ze základních rysů OOP umožňuje objektu schovat své vlastnosti/metody před okolním světem provádí se pomocí modifikátorů přístupu public: vlastnost/metoda je volně dostupná - využívat může kdokoliv private: vlastnost/metoda je skrytá využívat ji může jen objekt sám
Dědičnost jeden z hlavních rysů OOP umožňuje seskupovat objekty do hierarchie rodič potomek správně: generalizace - specializace objekt potomka získá veškeré vlastnosti i metody od svého rodiče
Charakteristický případ: existuje několik tříd slouží k podobnému účelu část kódu obsahují zcela stejnou Řešení: vytvoření společného předka (generalizace) bude obsahovat vlastnosti a metody, které jsou shodné pro všechny jeho potomky jednotlivým třídám definujeme společného předka
Příklad: dvě (nebo více) podobných tříd stejného typu Televize, Mikrovlnná trouba mají stejné vlastnosti/metody zapnout, vypnout, společné prvky přesunout do rodičovské třídy Elektrické zařízení
public class Televize public bool Zapnuto get; private set; public int Program get; private set; public class Mikrovlnka public bool Zapnuto get; private set; public int Casovac get; private set; public void Zapnout() this.zapnuto = true; public void Vypnout() this.zapnuto = false; public void Zapnout() this.zapnuto = true; public void Vypnout() this.zapnuto = false; public void PrepniProgram(int cislo) this.program = cislo; public void NastavCasovac(int minuty) this.casovac = minuty; Dvě totožné elektrické zařízení se liší pouze konkrétními metodami
public class ElektrickeZarizeni public bool Zapnuto get; private set; public class Televize : ElektrickeZarizeni public int Program get; private set; public void Zapnout() this.zapnuto = true; public void Vypnout() this.zapnuto = false; public void PrepniProgram(int cislo) this.program = cislo; public class Mikrovlnka : ElektrickeZarizeni public int Casovac get; private set; public void NastavCasovac(int minuty) this.casovac = minuty; Třídy Televize i Mikrovlnka jsou totožné s minulým řešením, avšak celý kód je výrazně efektivnější
Práce s instancí Televize t = new Televize(); t.zapnout(); if (t.zapnuto == true) t.prepniprogram(1); Mikrovlnka m = new Mikrovlnka(); m.zapnout(); if (m.zapnuto == true) m.nastavcasovac(2);
Charakteristický případ: existuje hotová třída má požadované vlastnosti i metody část funkcionality jí chybí Řešení: vytvoření potomka z daného předka (specializace) potomek přidá další vlastnosti/metody potomkovi navíc zůstalo to, co zdědil od předka
Příklad: viz. praktický příklad s třídami Televize a Mikrovlnka každý potomek si přidá metodu podle své potřeby (NastavCasovac a PrepniProgram)
Charakteristický případ: existuje hotová třída má potřebné metody (název, parametry, ) dělá činnost trochu jinak než chceme Řešení vytvoření potomka z daného předka (specializace) přepsání požadovaných metod (overrides) potomek pozměnil chování metody rodiče
Příklad: neurčitý objekt, který umí ukládat data pozměníme metodu pro uložení na výstup do databáze/souboru/externí webové služby/ Příklad: každý objekt se umí zobrazit jako text máme vlastní objekt, který chceme zobrazit textově podle potřeb přepíšeme metodu ToString()
public class Tvar public virtual double Obsah() throw new InvalidOperationException(); public class Obdelnik : Tvar public int A get; set; public int B get; set; public override double Obsah() return this.a * this.b; public class Kruh : Tvar public int R get; set; public override double Obsah() return Math.PI * Math.Pow(this.R, 2);
Práce s instancí Obdelnik obd = new Obdelnik(); obd.a = 2; obd.b = 5; // vypise 10 (2*5) Console.WriteLine( obd.obsah() ); Kruh kr = new Kruh(); kr.r = 5; // vypise 78,5 (3.14 * 5 * 5) Console.WriteLine( kr.obsah() );
Společný předek Tvar má metodu pro výpočet obsahu tato metoda sama nemůže vykonávat činnost abstraktní tvar nemá obsah musí být označena jako virtual (překrytelná) potomci si mohou tuto metodu volitelně upravit Každý potomek Obdélník a Kruh si upravuje metodu pro výpočet obsahu po svém metoda Obsah vykonává konkrétní výpočet způsob výpočtu závisí na konkrétním tvaru musí být označena jako override (překrývá)