in C#, Informatica

C# 8 – Default interface member

L’utilizzo delle interfacce è sempre consigliato. La distribuzione delle interfacce è utile, ad esempio, lavorando in team, distribuendo solo l’interfaccia e lasciando ad ogni singolo sviluppatore lo sviluppo.

Può capitare (molto spesso), di trovarci nella necessità di aggiungere delle nuove funzionalità alle interfacce.

Per farlo il metodo più rapido è quello di utilizzare degli extension method, che vanno ad estendere le funzionalità della singola interfaccia.

L’utilizzo di un extension method è consigliato, perchè non obbliga gli sviluppatori a riallineare il codice, con le nuove implementazioni.

Il punto fondamentale è che, l’utilizzo degli extension method, obbliga lo sviluppatore ad includere i namespace dove sono sono stati implementati.

In C# 8 è possibile ovviare a questo problema implementando direttamente le interfacce, utilizzando le lambda expression:

interface IWriter
{
    void Write(LogLevel level, string message);
    void Write(string message) => Write(DefaultLevel, message);
    void Write(Exception ex) => Write(LogLevel.Error, ex.ToString());
    LogLevel DefaultLevel => LogLevel.Information;
}

Nell’esempio precedente è stato definita un’interfaccia chiamata IWriter. All’interno, oltre alla normale definzione del metodo Write (che dovrà essere implementato) sono state dichiarate altre due firme che però sono implementate. L’implementazione avviene tramite le lambda.

Questo approccio risulta molto piu leggibile rispetto all’utilizzo degli extension method e soprattutto consente anche di implementare le singole proprietà (cosa non possibile con gli extension method).

Per quanto riguarda le classi che utilizzeranno queste particolari interfacce il comportamento sarà molto semplice:

  • dovranno essere implementati tutti i metodi che non hanno l’implementazione (comportamento normale)
  • i metodi che hanno un’implementazione potranno essere implementati all’interno della classe, facendo di fatto un override del comportamento iniziale, oppure no (rimanendo quelli originali)