Ce face Interfețe cu metode implicite (default interface methods)
Înainte de C# 8, adăugarea unei metode într-o interfață publicată obliga toate clasele care o implementau să o scrie, altfel nu mai compilau. Cu metodele implicite (default interface methods), interfața poate da o implementare de rezervă, iar clasele vechi continuă să funcționeze.
Metoda implicită este disponibilă doar prin tipul interfeței: pe o variabilă ConsolaJurnal nu o vezi, pe o variabilă IJurnal da. O clasă poate scrie propria variantă a metodei, care o înlocuiește pe cea implicită.
Interfețele mai pot avea membri static, iar din C# 11 membri static abstract, folosiți de generic math. Interfețele nu pot avea câmpuri de instanță, deci metodele implicite lucrează doar cu alți membri ai interfeței.
Exemple
Exemplul 1: Metodă nouă fără să schimbi clasele vechi
IJurnal j = new ConsolaJurnal();
j.Scrie("Pornire");
j.Info("Conectat");
j.Eroare("Fișier lipsă");
interface IJurnal
{
void Scrie(string mesaj);
void Info(string mesaj) => Scrie($"[INFO] {mesaj}");
void Eroare(string mesaj) => Scrie($"[EROARE] {mesaj}");
}
class ConsolaJurnal : IJurnal
{
public void Scrie(string mesaj) => Console.WriteLine(mesaj);
}
Rezultat
Pornire
[INFO] Conectat
[EROARE] Fișier lipsă
Exemplul 2: Clasa își scrie propria variantă
FisierJurnal înlocuiește Eroare; pentru Info folosește tot varianta din interfață.
IJurnal j = new FisierJurnal();
j.Info("Salvat");
j.Eroare("Disc plin");
interface IJurnal
{
void Scrie(string mesaj);
void Info(string mesaj) => Scrie($"[INFO] {mesaj}");
void Eroare(string mesaj) => Scrie($"[EROARE] {mesaj}");
}
class FisierJurnal : IJurnal
{
public void Scrie(string mesaj) => Console.WriteLine($"fișier: {mesaj}");
public void Eroare(string mesaj) => Scrie($"!!! {mesaj.ToUpper()}");
}
Rezultat
fișier: [INFO] Salvat
fișier: !!! DISC PLIN
Greșeli frecvente
new ConsolaJurnal().Info("x")nu se compilează: metoda implicită nu este membru al clasei. Declară variabila de tipul interfeței sau fă un cast((IJurnal)obiect).Info(...).- Metodele implicite nu funcționează pe .NET Framework, doar pe .NET Core 3.0 și versiunile ulterioare.
Comenzi înrudite
abstract (clase și metode abstracte): O clasă abstract nu poate fi instanțiată direct; metodele abstract nu au corp și trebuie implementate de fiecare clasă derivată.Metode de extensie (this): Adaugă metode unui tip existent (string, int, interfețe) fără să-l modifici: metodă statică cu this în fața primului parametru.
Întrebări & Exemple de Cod:
Interfețe cu metode implicite (default interface methods)Ai o nelămurire despre utilizarea comenzii
Interfețe cu metode implicite (default interface methods)sau ai descoperit un truc / fragment de cod util? Distribuie-l cu ceilalți programatori!Fii primul care pune o întrebare sau distribuie un fragment de cod / prompt!
Nu au fost adăugate încă întrebări sau exemple de cod pentru această pagină. Dacă ai întâlnit o problemă sau ai un snippet util, adaugă-l mai jos pentru a-i ajuta pe ceilalți.