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 Zapnout() { this.Zapnuto = true; }
public void Vypnout() { this.Zapnuto = false; }
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 PrepniProgram(int cislo) { this.Program = cislo; }
} public void Vypnout() { this.Zapnuto = false; }
}
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á)