以前の記事の 1 つで、C# でインターフェイスを使用する理由について説明しました。 しかし、C# には、抽象クラスと呼ばれる非常に重要なクラスがあります。抽象クラスは、抽象化できるメソッドを 1 つ以上持つことができます (署名のみ)。
ただし、インターフェイスには メソッド シグネチャのみが含まれています。次に、抽象クラスは C# のインターフェイスとどう違うのでしょうか。これは、C# のインタビューでよく聞かれる質問の 1 つです。抽象クラスとは何ですか?なぜそれを使用するのですか?
virtual、override、new、abstract キーワードの詳細については、こちらをご覧ください。 .
コードプロジェクト
抽象クラスとインターフェースの違い
抽象クラス | インターフェース |
このクラスのインスタンスを作成できません. | インターフェースはインスタンスではなく変数タイプのみです。 |
コンストラクタを持つことができます。 | コンストラクタを持つことはできません。 |
他のクラスに派生できます。 | 他のクラスから派生するように作成されています。 |
1 つ以上のメソッドの実装 (非抽象) を持つことができます。 | 関数を定義することはできません. |
具象クラスは 1 つの抽象クラスのみを実装できます | 具象クラスは多くのインターフェースを実装できます |
抽象メソッドを含めることができるかどうか | メソッド シグネチャのみを含める必要があります。 |
プライベートで保護された内部データ メンバーを持つことができます。 | すべてのメンバーはデフォルトで公開されています。 |
構造には派生できません。 | 構造によって導出できます。 |
抽象クラスの実践的な実装
抽象クラスの実用的な実装について話しましょう。ほとんどの人はこれらのクラスの理論についてよく知っていますが、実装に関する限り、彼らはそれについて確信が持てません.
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)); } }
抽象クラスがメソッドの実装を持つことができることに注意する必要があります。上記のコードでは、DataSource という名前の抽象基本クラスを作成しました。 このクラスは、具体的なクラス、つまり MsSqlDataSource と OracleDataSource に派生します。
具象クラスには接続を開く方法があります。ただし、構成ファイルの接続文字列を取得する一般的な方法が必要です。
私たちのアプリケーションでは、Ms SQL サーバー、Oracle サーバー、または Excel ファイルのような異なるデータソースを使用しなければならない可能性があります。上記のコードには、データ ソース名と環境 (DEV、QA、PROD など) に基づいて構成ファイルからデータソース接続文字列を取得するためのプライベート メソッドがあります。
ここで、以下のコードを実行します。
DataSource sqlDS = new MsSqlDataSource("DEV"); sqlDS.OpenAndReturnConnection();
次の出力が得られます
ここでは、DEV 環境の MsSql の接続文字列を取得しています。この機能は、DataSource から派生したすべてのクラスに共通です。 クラス。また、接続の作成は派生クラスに固有です。したがって、抽象基本クラスに抽象メソッドがあります。
非常に基本的で小さな例ですが。しかし、抽象クラスの使用法を理解するのに役立ちます.
結論:
この記事では、抽象クラスとそのインターフェースとの違いについて説明しました。この記事には、抽象クラスについての理解を明確にする小さな例も含まれています。