Perché usiamo la classe C# Abstract

Perché usiamo la classe C# Abstract

In uno dei miei precedenti articoli ho descritto perché usiamo l'interfaccia in C#. Ma in C# abbiamo una classe molto importante nota come classe astratta. La classe astratta può avere uno o più metodi che possono essere astratti (solo firma).

Ma l'interfaccia contiene solo la firma del metodo. Allora in che modo una classe astratta è diversa da un'interfaccia in C#. È una delle domande preferite nell'intervista in C#. Cos'è la classe astratta e perché la usiamo?

Puoi saperne di più sulle parole chiave virtuali, override, nuove e astratte qui .

CodeProject

Classe astratta e differenza di interfaccia

Classe astratta Interfaccia
Non possiamo creare un'istanza della classe this.  L'interfaccia può essere solo di tipo variabile e non di istanza.
Può avere un costruttore. Non può avere un costruttore.
Può essere derivato da qualche altra classe. Viene creato per essere derivato da un'altra classe.
Può avere l'implementazione (non astratta) di uno o più metodi. Non può avere una definizione di funzione.
La classe Concrete può implementare solo una classe astratta La classe Concrete può implementare molte interfacce
Può o non può contenere metodi astratti Dovrebbe avere solo firme di metodo.
 Può avere membri dati interni privati ​​e protetti.  Tutti i membri sono pubblici per impostazione predefinita.
 Non può essere derivato da una struttura. Può essere derivato da una struttura.

Implementazione pratica della classe astratta

Parliamo dell'implementazione pratica della classe astratta. La maggior parte delle persone è molto consapevole della teoria di queste classi, ma per quanto riguarda l'implementazione non ne è sicura.

    public abstract class DataSource
    {
        protected string dataSourceName;
        private string environment;
        protected DataSource(string environment, string dsName)
        {
            this.environment = environment;
            this.dataSourceName = dsName;

            GetDataSourceCredentials();
        }

        private void GetDataSourceCredentials()
        {
            Console.WriteLine(string.Format("Get {0}'s connection setting for {1} environment from config file", dataSourceName, environment));
        }

        public abstract void OpenAndReturnConnection();
    }

    public class MsSqlDataSource : DataSource
    {
        public MsSqlDataSource(string environment) : base(environment, "MsSQL")
        {
            
        }

        public override void OpenAndReturnConnection()
        {
            Console.WriteLine(string.Format("Create and return Connection for {0} dataSource",
 dataSourceName));
        }
    }

    public class OracleDataSource : DataSource
    {
        public OracleDataSource(string environment) : base(environment, "Oracle")
        {
        }

        public override void OpenAndReturnConnection()
        {
            Console.WriteLine(string.Format("Create and return Connection for {0} dataSource", dataSourceName));
        }
    }

Dovremmo essere consapevoli che la classe astratta può avere la sua implementazione per i metodi. Nel codice sopra ho creato una classe base astratta denominata DataSource. Questa classe deriva dalle classi concrete, ovvero MsSqlDataSource e OracleDataSource.

La classe concreta aprirà la connessione. Ma dovrebbe esserci un modo comune per ottenere la stringa di connessione per il file di configurazione.

Nella nostra applicazione ci può essere la possibilità che dobbiamo utilizzare diverse origini dati come il server Ms SQL, il server Oracle o potrebbe essere un file excel. Nel codice sopra ho un metodo privato per ottenere la stringa di connessione dell'origine dati dal file di configurazione in base al nome dell'origine dati e all'ambiente (ad es. DEV, QA o PROD).

Ora esegui il codice seguente .

            DataSource sqlDS = new MsSqlDataSource("DEV");
            sqlDS.OpenAndReturnConnection();

Otterrò il seguente output

Qui sto ottenendo la stringa di connessione per MsSql per l'ambiente DEV. Questa funzionalità è comune a tutte le classi derivate da DataSource classe. E la creazione di Connection è specifica per la classe derivata. Quindi abbiamo un metodo astratto nella classe base astratta.

Anche se è un esempio molto semplice e di piccole dimensioni. Ma può aiutarti a capire l'uso della classe astratta.

Conclusione:

In questo articolo ho discusso della classe astratta e delle sue differenze con l'interfaccia. L'articolo include anche un piccolo esempio che può chiarire la comprensione della classe astratta.