Sobes.tech
Junior — Middle

Na czym polega różnica między używaniem klasy abstrakcyjnej a interfejsu przy definiowaniu kontraktów dla klas?

sobes.tech AI

Odpowiedź od AI

Klasa abstrakcyjna i interfejs w C# służą do definiowania kontraktów, ale mają kluczowe różnice:

  • Klasa abstrakcyjna może zawierać implementacje metod, pola, konstruktory i właściwości. Jest używana, gdy trzeba ustalić podstawową implementację i wspólne funkcje dla dziedziczących.
  • Interfejs definiuje tylko sygnatury metod, właściwości i zdarzeń bez implementacji (do C# 8.0; od C# 8.0 interfejsy mogą zawierać domyślne implementacje).

Ponadto, klasa może dziedziczyć tylko po jednej klasie abstrakcyjnej, ale może implementować wiele interfejsów.

Przykład:

abstract class Animal
{
    public abstract void MakeSound();
    public void Sleep() { Console.WriteLine("Śpi"); }
}

interface IFlyable
{
    void Fly();
}

class Bird : Animal, IFlyable
{
    public override void MakeSound() { Console.WriteLine("Ćwir ćwir"); }
    public void Fly() { Console.WriteLine("Lata"); }
}

W ten sposób, klasa abstrakcyjna nadaje się do ogólnego podstawowego zachowania, a interfejs do określenia zestawu możliwości, które mogą być realizowane przez różne klasy.