abstract (clase și metode abstracte) în C# (.NET)

O clasă abstract nu poate fi instanțiată direct; metodele abstract nu au corp și trebuie implementate de fiecare clasă derivată.

Sintaxă C#
abstract class Forma { public abstract double Arie(); public string Descriere() => $"Arie {Arie()}"; }

Ce face abstract (clase și metode abstracte)

O clasă abstract este un model incomplet: definește ce au în comun toate derivatele și lasă unele metode fără implementare. new Forma() nu se compilează; creezi doar obiecte din clasele concrete derivate.

O metodă abstract are doar semnătura și se termină cu ;. Este implicit virtuală, iar fiecare clasă derivată neabstractă trebuie să o implementeze cu override. Clasa abstractă poate avea și câmpuri, constructori și metode complete, ceea ce o deosebește de o interfață.

Alege o clasă abstractă când derivatele au cod și stare comune (de exemplu un șablon de pași, cu un singur pas variabil). Alege o interfață când vrei doar un contract, pe care să-l poată implementa și tipuri fără legătură între ele.

Exemple

Exemplul 1: Forme geometrice

Forma[] forme = [new Dreptunghi(3, 4), new Patrat(5)];

foreach (Forma f in forme)
    Console.WriteLine(f.Descriere());

abstract class Forma
{
    public abstract int Arie();
    public string Descriere() => $"{GetType().Name}: arie {Arie()}";
}

class Dreptunghi(int latime, int inaltime) : Forma
{
    public override int Arie() => latime * inaltime;
}

class Patrat(int latura) : Dreptunghi(latura, latura) { }

Rezultat

Dreptunghi: arie 12
Patrat: arie 25

Exemplul 2: Șablon de pași cu un pas abstract

Clasa de bază fixează ordinea pașilor; derivatele schimbă doar modul de livrare.

new LivrareCurier().Proceseaza("Ana");
new RidicarePersonala().Proceseaza("Mihai");

abstract class Comanda
{
    public void Proceseaza(string client)
    {
        Console.WriteLine($"Plată confirmată pentru {client}");
        Livreaza(client);
    }

    protected abstract void Livreaza(string client);
}

class LivrareCurier : Comanda
{
    protected override void Livreaza(string client) => Console.WriteLine("Trimis prin curier");
}

class RidicarePersonala : Comanda
{
    protected override void Livreaza(string client) => Console.WriteLine("Gata de ridicare din magazinul din Iași");
}

Rezultat

Plată confirmată pentru Ana
Trimis prin curier
Plată confirmată pentru Mihai
Gata de ridicare din magazinul din Iași

Greșeli frecvente

  • O metodă abstract cu corp sau într-o clasă care nu e abstract dă eroare de compilare.
  • O clasă derivată care uită să implementeze o metodă abstractă trebuie să fie și ea abstract, altfel primești CS0534.
  • Constructorul unei clase abstracte e bine să fie protected: oricum poate fi apelat doar din derivate.

Comenzi înrudite