Interfețe cu metode implicite (default interface methods) în C# (.NET)

Din C# 8 o interfață poate avea metode cu corp; clasele care o implementează le primesc automat, fără să le scrie.

Sintaxă C#
interface IJurnal { void Scrie(string m); void Info(string m) => Scrie($"[INFO] {m}"); }

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.
Comunitate & Schimb de cunoștințe

Î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.

Comunitate Adaugă o întrebare sau distribuie un cod

Moderare & Siguranță:

Pentru a menține calitatea și securitatea informațiilor, fiecare întrebare sau fragment de cod/prompt este analizat (manual sau prin moderare asistată de AI) înainte de publicare.