C# Interfaccie o classi astratte?

zouth

Utente Silver
16 Dicembre 2020
82
36
4
61
Ciao a tutti, sto studiando C# da un po e ho appena finito di studiare le interfacce e le ho capite senza problemi, l'unico dubbio che mi viene è perchè usare un interfaccia piuttosto che una classe astratta e viceversa;
cioè se qulcuno mi dicesse di fare un programma o esercizio usando le interfaccie glielo saprei fare senza problemi ma continuerei a non capire perchè mi abbia fatto usare un'interfccia piuttosto che una classe astratta.
Se qualcuno riuscisse a spiegarmelo glie ne sarei molto grato.
 
Essendo autodidatta posso darti una spiegazione piu' pratica che teorica. Uso le classi astratte quando voglio implementare una parte di logica e lasciare alcuni metodi virtual da implementare in altre classi derivate. Mentre le interfacce sono comode soprattutto quando e' necessario reimplementare tutta la logica o essere usate da altri processi. Ti faccio un esempio che mi e' capitato di recente: volevo realizzare una classe astratta per algoritmi di Hash, non ho usato un interfaccia per il semplice motivo che i costrutti HMAC, PBKDF2 e ComputeHash che ho implementato sono comuni a tutti gli algoritmi e quindi basta implementarli una sola volta nella classe "padre", mentre i metodi di init, update e final li ho lasciati come virtual per essere implementati dalle classi derivate. Al contrario ho scelto un interfaccia per un sistema di IPC che poteva usare diversi metodi es. File, Pipe, Socket, COM, Windows API... Essendo implementazioni del tutto diverse ho fatto un interfaccia con solo i metodi comuni es. Send, Receive ecc...

Un'altra differenza e' che le classi astratte possono definire anche eventi, puoi inizializzare variabili membri, puoi avere costanti e membri static e altre caratteristiche proprie delle classi.

Di fatto se fai una classe che ha tutti i metodi astratti la stai usando come un interfaccia, a quel punto tanto vale usare quest'ultima a mio parere.