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ă
abstractcu corp sau într-o clasă care nu eabstractdă 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
Moștenire: virtual, override și base: O clasă derivată preia membrii clasei de bază (class B : A); metodele virtual pot fi înlocuite cu override, iar base apelează varianta de bază.sealed: Interzice moștenirea unei clase sau suprascrierea mai departe a unei metode override.Interfețe cu metode implicite (default interface methods): Din C# 8 o interfață poate avea metode cu corp; clasele care o implementează le primesc automat, fără să le scrie.