This article is currently in the process of being translated into Czech (~73% done).
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ě není moc užitečná pro naší třídu Dog. Pojďme ji přepsat
class Dog : FourLeggedAnimal
{
public override string Describe()
{
return "This four legged animal is a Dog!";
}
}
In this case, we do a complete override, but in some cases, you might want to use the behavior from the base class in addition to new functionality. This can be done by using the base keyword, which refers to the class we inherit from:
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;
}
}
Now obviously, you can create other subclasses of the FourLeggedAnimal class - perhaps a cat or a lion? In the next chapter, we will do a more advanced example and introduce abstract methods as well. Read on.