This article has been localized into Czech by the community.
Abstraktní třídy
Abstraktní třídy označené klíčovým slovem "abstrakt" v definici třídy se obvykle používají k definování základní třídy v hierarchii. Co je na nich zvláštní, je to, že nemůžete vytvořit jejich instanci - pokud se pokusíte, dostanete chybu kompilace. Místo toho je musíte podřídit, jak je uvedeno v kapitole o dědictví, a vytvořit instanci vaší podtřídy. Takže kdy potřebujete abstraktní třídu? Opravdu záleží na tom, co děláte.
Pravdu říct, většina věcí lze udělat bez použití abstraktních tříd, ale v určitých případech, jako například u frameworků, jsou abstraktní třídy velmi užitečná pomůcka. To je také důvod, proč .NET sám o sobě obsahuje spoustu abstraktních tříd. Abstraktní třídy se hodí, jak jméno napovídá, když popisujeme něco abstraktního, něco co je spíše koncept, než nějaká reálná věc.
V tomto příkladu vytvoříme základní třídu pro čtyřnohá zvířata a pak vytvoříme třídu psů, která z ní dědí, jako je to zde:
namespace AbstractClasses
{
class Program
{
static void Main(string[] args)
{
Dog dog = new Dog();
Console.WriteLine(dog.Describe());
Console.ReadKey();
}
}
abstract class FourLeggedAnimal
{
public virtual string Describe()
{
return "Not much is known about this four legged animal!";
}
}
class Dog : FourLeggedAnimal
{
}
}
Když to porovnáte s příklady z kapitoly o dědičnosti, neuvidíte nijak velký rozdíl. Největším rozdílem, je slovíčko "abstract" před deklarací třídy FourLeggedAnimal. Jak jistě vidíte, vytvořili jsme novou instanci třídy Dog, a pak jsme zavolali zděděnou metodu Desribe() ze třídy FourLeggedAnimal. Teď si naopak zkuste vytvořit instanci vytvořit instanci třídy FourLeggedAnimal:
FourLeggedAnimal someAnimal = new FourLeggedAnimal();
Vrátí vám to tento kompilační error
Nemůžete vytvořit instanci abstraktní třídy nebo rozhraní 'AbstractClasses.FourLeggedAnimal'
Nyní, jak vidíte, jsme zdědili metodu Describe(), ale v této formě pro naši třídu Dog není moc užitečná. Pojďme ji přepsat.
class Dog : FourLeggedAnimal
{
public override string Describe()
{
return "This four legged animal is a Dog!";
}
}
V tomto případě provedeme kompletní přepis, ale v některých případech byste možná chtěli použít chování základní třídy společně s novou funkcionalitou. To lze provést pomocí klíčového slova base, které odkazuje na třídu, ze které dědíme:
abstract class FourLeggedAnimal
{
public virtual string Describe()
{
return "This animal has four legs.";
}
}
class Dog : FourLeggedAnimal
{
public override string Describe()
{
string result = base.Describe();
result += " In fact, it's a dog!";
return result;
}
}
Samozřejmě můžete vytvořit další podtřídy třídy FourLeggedAnimal - možná kočku nebo lva? V další kapitole provedeme pokročilejší příklad a také představíme abstraktní metody více. Čtěte dál.