This article has been localized into Czech by the community.
Více o abstraktních třídách
V minulé kapitole jsme se podívali na abstraktní třídy. V této kapitole příklady trochu rozšíříme a přidáme do nich abstraktní metody také. Abstraktní metody jsou povoleny pouze v abstraktních třídách. Jejich definice bude vypadat jako běžná metoda, ale nemají v sobě žádný kód:
abstract class FourLeggedAnimal
{
public abstract string Describe();
}
Tak proč byste chtěl definovat prázdnou metodu, která nic nedělá? Protože abstraktní metoda je závazek k implementaci dané metody ve všech podtřídách. Je to dokonce kontrolováno v době kompilace, aby bylo zajištěno, že vaše podtřídy mají tuto metodu definovanou. Jedná se tedy o skvělý způsob, jak vytvořit základní třídu pro něco, při zachování určité míry kontroly nad tím, co by měly všechny podtřídy moci dělat. Mějme na paměti, že lze vždy zacházet s podtřídou jako se základní třídou, kdykoliv potřebujete použít metody definované jako abstraktní metody na základní třídě. Zvažte například následující příklad:
namespace AbstractClasses
{
class Program
{
static void Main(string[] args)
{
System.Collections.ArrayList animalList = new System.Collections.ArrayList();
animalList.Add(new Dog());
animalList.Add(new Cat());
foreach(FourLeggedAnimal animal in animalList)
Console.WriteLine(animal.Describe());
Console.ReadKey();
}
}
abstract class FourLeggedAnimal
{
public abstract string Describe();
}
class Dog : FourLeggedAnimal
{
public override string Describe()
{
return "I'm a dog!";
}
}
class Cat : FourLeggedAnimal
{
public override string Describe()
{
return "I'm a cat!";
}
}
}
Jak vidíte, vytváříme ArrayList pro naše zvířata. Pak vytvoříme nového psa a novou kočku a přidáme je do seznamu. Jsou vytvořeni jako Dog a Cat, ale jsou také typu FourLeggedAnimal (čtyřnohé zvíře), a protože překladač ví, že podtřídy této třídy obsahují metodu Describe() (pro popis), můžete tuto metodu ve skutečnosti volat, aniž byste znali přesný typ zvířete. Takže typovým přetypováním na FourLeggedAnimal, které děláme v cyklu foreach, získáváme přístup k členům podtříd. To může být velmi užitečné v mnoha scénářích.