C# è un linguaggio di programmazione orientato agli oggetti, generico e indipendente dai tipi. In questa piattaforma, i programmatori possono applicare classi o interfacce astratte al loro codice per una varietà di scopi. Se si desidera sviluppare le proprie competenze informatiche, è possibile trarre vantaggio dall’apprendimento di questi due strumenti C# essenziali.
In questo articolo vengono illustrate le definizioni e le differenze tra classe astratta e interfaccia in C# e vengono descritti esempi di quando è possibile utilizzare questi due componenti di programmazione.
Che cos’è una classe astratta in C#?
Una classe astratta in C# è una classe con il modificatore “abstract”. Questo modificatore indica che la classe è priva di componenti o ha un’implementazione incompleta. “Abstract” è una parola chiave che i programmatori possono applicare a classi, proprietà e metodi.
I programmatori possono utilizzare questo modificatore per impedire alle persone di creare direttamente una determinata classe o oggetto e costringerli a creare una classe o un oggetto derivato specifico da un insieme di opzioni. Se qualcuno tenta di creare una classe astratta, viene visualizzata una notifica di errore che dice un messaggio del tipo “Impossibile creare un’istanza di una classe astratta”.
Ad esempio, se un programmatore ha una classe “Studente” derivata da “Utente”, può rendere la classe “Utente” astratta per garantire che le persone possano creare solo una classe “Studente” o un’altra classe particolare. Nel codice, possono scrivere “public abstract class User”. Quindi, se scrivono “new User();”, è impossibile per loro creare quella classe. Per un altro esempio, considera che un programmatore ha una classe “Tree” con tre sottoclassi, “Oak”, “Maple” e “Evergreen”. Per impedire alle persone di creare istanze di oggetti generici “Tree” che sono implementazioni incomplete, i programmatori possono precedere la classe “Tree” con la parola chiave “abstract”.
Che cos’è un’interfaccia in C#?
Un’interfaccia in C# è un costrutto di linguaggio per accoppiare le applicazioni in modo approssimativo o ridurre l’accoppiamento stretto tra i componenti. In questo modo, i programmatori possono garantire che la modifica di uno di questi componenti o classi abbia un impatto minimo o nullo sugli altri componenti. Questo è in contrasto con i componenti che dipendono pesantemente da altri componenti.
Per dichiarare un’interfaccia, utilizzare la parola chiave “interface” anziché la parola chiave “class”. Tutte le interfacce iniziano con “I”, quindi ogni volta che vedi un tipo come questo, puoi sapere che si tratta di un’interfaccia. In questo modo, il componente dipende da un’interfaccia piuttosto che da un altro componente.
Classe astratta vs. interfaccia in C #
Le classi e le interfacce astratte sono costrutti simili in C#, soprattutto in termini di sintassi. Tuttavia, hanno alcune importanti differenze e scopi fondamentali nel tuo programma. Ecco alcune differenze tra questi due componenti:
Implementazione
Le classi astratte hanno implementazione e le interfacce no. Le classi astratte possono avere implementazione per alcuni dei suoi membri, mentre le interfacce non possono avere implementazione per nessuno dei suoi membri. Se si tenta di eseguire un programma dopo aver scritto codice per implementare i membri di una classe di interfaccia, viene visualizzato un messaggio di errore che dice “Il modificatore ‘pubblico’ non è valido per questo elemento”.
Nelle classi, i programmatori possono definire una sorta di logica. Le interfacce possono avere dichiarazioni, ma i loro metodi non hanno corpi con parentesi graffe. Le interfacce non sono classi concrete con codice. Sono solo la firma.
Modificatori di accesso
I modificatori di accesso sono strumenti per specificare l’ambito di accessibilità di un membro di una classe o di un tipo di classe. I membri astratti della classe possono avere modificatori come pubblico, privato, protetto o interno. Questi sono privati, per impostazione predefinita. I membri dell’interfaccia non dispongono di modificatori di accesso. Sono pubblici, per impostazione predefinita.
I componenti pubblici sono accessibili a chiunque. Le classi interne sono accessibili solo a un gruppo selezionato. Private è il tipo di modificatore predefinito. Per questi modificatori, l’accesso è solo all’interno della definizione della classe. Per i modificatori protetti, i componenti sono accessibili a qualsiasi elemento all’interno della definizione della classe e a qualsiasi classe ereditata dalla classe.
Campi
Le classi astratte possono avere campi, ma le interfacce no. In C#, un campo è un membro di una classe o un oggetto di qualsiasi tipo che simboleggia una posizione di memoria per l’archiviazione di un valore. È anche noto come variabile a livello di classe o membro.
Se un programmatore tenta di aggiungere un campo a un’interfaccia come “int” e tenta di creare il programma, viene visualizzato un messaggio di errore che dice “Le interfacce non possono contenere campi”. Al contrario, l’aggiunta di un campo come “int” a una classe astratta consente ai programmatori di creare il programma con successo.
Eredità
In C# e in altri linguaggi di programmazione orientati agli oggetti, l’ereditarietà è una funzionalità che consente ai programmatori di definire una classe base che offre una particolare funzionalità, dati e comportamento, e definisce classi derivate o sottoclassi che ereditano o sostituiscono tale funzionalità. Un’interfaccia può ereditare solo da un’altra interfaccia. Non può ereditare da una classe astratta. Al contrario, le classi astratte possono ereditare da altre classi o interfacce astratte.
Inoltre, le classi possono ereditare da più interfacce contemporaneamente. Tuttavia, le classi non possono ereditare da più classi contemporaneamente. C# non supporta l’ereditarietà di più classi perché può aggiungere troppa complessità e causare una serie di problemi. Le classi possono ereditare solo da una classe a padre singolo, semplificando la progettazione.
Quando usare la classe astratta rispetto all’interfaccia in C #
L’aggiunta di classi astratte al codice può aggiungere sicurezza al programma. È possibile eseguire questa operazione se esiste una classe da cui non si desidera creare un’istanza di oggetti. Rendendo astratta quella classe, le persone non possono più creare un oggetto da quella classe. Inoltre, prendere in considerazione l’utilizzo di una classe astratta se è presente codice condiviso tra le implementazioni. Ciò significa che non è necessario ripetere il codice in ciascuna delle classi discendenti.
Prendere in considerazione l’utilizzo di un’interfaccia se non è presente codice condiviso tra le implementazioni. Utilizzare questo strumento per dichiarare una serie di funzionalità per un oggetto. L’utilizzo di interfacce in questi casi può lasciare aperta l’ereditarietà e consentire alla classe di discendere da diverse classi di base, se necessario.
Tieni presente che nessuna delle società menzionate in questo articolo è affiliata a Indeed.