Sobes.tech
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!");
    }
}