Warum verwenden wir die C# Abstract-Klasse

Warum verwenden wir die C# Abstract-Klasse

In einem meiner vorherigen Artikel habe ich beschrieben, warum wir Schnittstellen in C# verwenden. Aber in C# haben wir eine sehr wichtige Klasse, die als abstrakte Klasse bekannt ist. Abstrakte Klassen können eine oder mehrere Methoden haben, die abstrakt sein können (nur Signatur).

Aber die Schnittstelle enthält nur die Methodensignatur. Wie unterscheidet sich dann eine abstrakte Klasse von einer Schnittstelle in C#? Es ist eine der beliebtesten Fragen im C#-Interview. Was ist eine abstrakte Klasse und warum verwenden wir sie?

Hier erfahren Sie mehr über virtuelle, überschreibende, neue und abstrakte Schlüsselwörter .

CodeProject

Unterschied zwischen abstrakter Klasse und Schnittstelle

Abstrakte Klasse Benutzeroberfläche
Wir können keine Instanz dieser Klasse erstellen.  Schnittstelle kann nur ein variabler Typ und keine Instanz sein.
Es kann einen Konstruktor haben. Es kann keinen Konstruktor haben.
Sie kann von einer anderen Klasse abgeleitet werden. Es wird erstellt, um von einer anderen Klasse abgeleitet zu werden.
Es kann eine oder mehrere Methoden implementieren (nicht abstrakt). Es kann keine Funktionsdefinition haben.
Konkrete Klasse kann nur eine abstrakte Klasse implementieren Concrete-Klasse kann viele Schnittstellen implementieren
Es kann abstrakte Methoden enthalten oder nicht Es sollte nur Methodensignaturen haben.
 Es kann private, geschützte, interne Datenmitglieder haben.  Alle Mitglieder sind standardmäßig öffentlich.
 Es kann nicht von einer Struktur abgeleitet werden. Er kann durch eine Struktur abgeleitet werden.

Praktische Umsetzung der abstrakten Klasse

Lassen Sie uns über die praktische Implementierung der abstrakten Klasse sprechen. Die meisten Leute sind sich der Theorie dieser Klassen sehr wohl bewusst, aber was die Implementierung betrifft, sind sie sich nicht sicher.

    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));
        }
    }

Wir sollten uns bewusst sein, dass eine abstrakte Klasse ihre Implementierung für die Methoden haben kann. Im obigen Code habe ich eine abstrakte Basisklasse namens DataSource erstellt. Diese Klasse wird von den konkreten Klassen abgeleitet, d. h. MsSqlDataSource und OracleDataSource.

Die konkrete Klasse wird ihren Weg finden, um die Verbindung zu öffnen. Aber es sollte einen gemeinsamen Weg geben, um die Verbindungszeichenfolge für die Konfigurationsdatei zu erhalten.

In unserer Anwendung kann es vorkommen, dass wir eine andere Datenquelle wie Ms SQL-Server, Oracle-Server oder eine Excel-Datei verwenden müssen. Im obigen Code habe ich eine private Methode zum Abrufen der Datenquellen-Verbindungszeichenfolge aus der Konfigurationsdatei basierend auf dem Datenquellennamen und der Umgebung (z. B. DEV, QA oder PROD).

Führen Sie nun den folgenden Code aus .

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

Ich erhalte die folgende Ausgabe

Hier erhalte ich die Verbindungszeichenfolge für MsSql für die DEV-Umgebung. Diese Funktionalität ist allen von DataSource abgeleiteten Klassen gemeinsam Klasse. Und die Erstellung von Connection ist spezifisch für die abgeleitete Klasse. Daher haben wir eine abstrakte Methode in der abstrakten Basisklasse.

Obwohl es ein sehr einfaches und kleines Beispiel ist. Aber es kann Ihnen helfen, die Verwendung der abstrakten Klasse zu verstehen.

Fazit:

In diesem Artikel habe ich über die abstrakte Klasse und ihre Unterschiede zur Schnittstelle gesprochen. Der Artikel enthält auch ein kleines Beispiel, das das Verständnis der abstrakten Klasse verdeutlichen kann.