Middle
V jakých případech byste měli používat rozhraní a v jakých abstraktní třídu?
sobes.tech AI
Odpověď od AI
Použijte rozhraní k určení kontraktu chování, který mohou třídy implementovat. To umožňuje dosáhnout polymorfismu a oslabit vazbu mezi třídami. Třída může mít více rozhraní, ale pouze jednu základní třídu.
Použijte abstraktní třídy, když máte společnou implementaci části funkčnosti a chcete poskytnout základní strukturu pro odvozené třídy. Abstraktní třídy mohou obsahovat abstraktní a normální metody, stejně jako pole. Jsou vhodné, když je vyžadováno dědičnost "je".
| Vlastnost | Rozhraní | Abstraktní třída |
|---|---|---|
| Vícenásobná dědičnost | Ano | Ne |
| Implementace | Ne (až do .NET 8 s výchozími metodami rozhraní) | Ano, částečná nebo úplná |
| Pole | Ne | Ano |
| Konstruktory | Ne | Ano |
| Typ vztahu | "může dělat" ("has-a") | "je" ("is-a") |
Příklad použití rozhraní:
// Definujeme kontrakt pro objekty, které umí létat
public interface IFlyable
{
void Fly();
}
// Třída letadla implementuje rozhraní IFlyable
public class Airplane : IFlyable
{
public void Fly()
{
// Implementace letu letadla
Console.WriteLine("Letadlo letí");
}
}
// Třída ptáka také implementuje rozhraní IFlyable
public class Bird : IFlyable
{
public void Fly()
{
// Implementace letu ptáka
Console.WriteLine("Pták letí");
}
}
Příklad použití abstraktní třídy:
// Abstraktní třída Animal s obecným provedením dýchání
public abstract class Animal
{
public void Breathe()
{
Console.WriteLine("Zvíře dýchá");
}
// Abstraktní metoda, kterou musí implementovat odvozené třídy
public abstract void MakeSound();
}
// Konkrétní třída psa, která dědí od Animal
public class Dog : Animal
{
public override void MakeSound()
{
Console.WriteLine("Haf!");
}
}
// Konkrétní třída kočky, která dědí od Animal
public class Cat : Animal
{
public override void MakeSound()
{
Console.WriteLine("Mňau!");
}
}