抽象クラスとは?
抽象クラスとは、インタフェースとほとんど同じような効果を発揮しますが、異なる点は、ロジックが書けるという点です。インタフェースは定義しか書けないのに対して、抽象クラスはロジックが書けるため、ロジックの途中で部分的に抽象クラスのメソッドに切り替えることができます。このような書き方をデザインパターンのテンプレートパターンといいます。
抽象クラスの書き方
抽象クラスの書き方は、アクセス修飾子、abstractキーワード、classキーワード、任意のクラス名の順に書きます。抽象クラスを継承するサブクラス側は、通常の継承のときと同じ書き方になるので、サブクラスのクラス名の後にコロンでつないで抽象クラス名を記述します。
抽象メソッドとは?
抽象メソッドとは、派生クラスに実装を強制するメソッドになります。抽象クラスは普通のクラスのように記述できますが、派生クラスに処理をゆだねる場合は、メソッドにabstractキーワードを付けて、派生クラスに実装を強制できます。
サンプルコード
抽象クラスはabstractキーワードを使います。インタフェースではSaveメソッドのみを強制するという感じですが、抽象クラスはSaveクラスに共通部分のロジックを記述し、共通にできない部分のみを派生クラスに委ねます。この場合、トランザクションやコミット、ロールバック処理は共通ですが、Save処理は各派生クラスごとに、登録するテーブルが異なるため、この部分だけSaveMethodで派生クラスに実装を強制しています。派生クラスに実装を強制する場合はメソッドにabstractキーワードを付けます。
namespace CS29 { public abstract class DataBase { public void Save() { try { Transaction(); SaveMethod(); //ここが虫食い状態(派生クラスごとに処理が違う) Commit(); } catch { RollBack(); } } protected abstract void SaveMethod(); private void Transaction() { } private void Commit() { } private void RollBack() { } } }
派生クラスは、抽象クラスのabstractメソッドをoverrideキーワードを用いて実装しておかないとコンパイルエラーとなります。
namespace CS29 { class Products : Database { protected override void SaveMethod() { Console.WriteLine("商品マスタの登録"); } } }
namespace CS29 { class Orders : Database { protected override void SaveMethod() { Console.WriteLine("発注テーブル登録"); } } }
namespace CS29 { public partial class Form1 : Form { public Form1() { InitializeComponent(); Database product = new Products(); Database orders = new Orders(); List databases = new List(); databases.Add(product); databases.Add(orders); foreach (var val in databases) { val.Save(); } } } }
クライアントコードでの実装はインタフェースのときと何ら変わりません。val.Save()の部分で抽象クラスの場合はトランザクション処理等が共通で行われていますが、特に意識せず、クライアントコードからは呼び出しを行うことができます。
- C#初心者のための基礎!C#文法2割の知識で8割の仕事をする方法!#1
- C#初心者のための基礎!ブロックと名前空間とクラスとメソッドを解説#2
- C#初心者のための基礎!#3値の扱い方。変数と定数をわかりやすく解説!
- C#初心者のための基礎!データ型の種類と使い分けをわかりやすく解説#4
- C#初心者のための基礎!値型と参照型の違いと使い方をわかりやすく解説#5
- C#初心者のための基礎!データ型の変換のやり方をわかりやすく解説#6
- C#初心者のための基礎!配列の使い方をわかりやすく解説#7
- C#初心者のための基礎!動的配列List<T>の使い方をわかりやすく解説#8
- C#初心者のための基礎!演算子の使い方をわかりやすく解説#9
- C#初心者のための基礎!if文とswich文の使い方をわかりやすく解説#10
- C#初心者のための基礎!while文の書き方と使い方をわかりやすく解説#11
- C#初心者のための基礎!do-While文の書き方と使い方をわかりやすく解説#12
- C#初心者のための基礎!for文の書き方と使い方をわかりやすく解説#13
- C#初心者のための基礎!foreach文の書き方と使い方をわかりやすく解説#14
- C#初心者のための基礎!オブジェクト指向の意味をわかりやすく解説#15
- C#初心者のための基礎!クラスの意味と使い方をわかりやすく解説#16
- C#初心者のための基礎!コンストラクタの意味と使い方をわかりやすく解説#17
- C#初心者のための基礎!アクセス修飾子の意味と使い方をわかりやすく解説#18
- C#初心者のための基礎!メソッドの意味と使い方をわかりやすく解説#19
- C#初心者のための基礎!フィールドの意味と使い方をわかりやすく解説#20
- C#初心者のための基礎!インスタンスの意味と使い方をわかりやすく解説#21
- C#初心者のための基礎!カプセル化の意味と使い方をわかりやすく解説#22
- C#初心者のための基礎!プロパティの意味と使い方をわかりやすく解説#23
- C#初心者のための基礎!Disposeとusingの意味と使い方を解説#24
- C#初心者のための基礎!staticスタティックの意味と使い方を解説#25
- C#初心者のための基礎!継承の意味と使い方をわかりやすく解説#26
- C#初心者のための基礎!override(オーバーライド)の使い方を解説#27
- C#初心者のための基礎!ポリモーフィズムとインタフェースの使い方を解説#28
- C#初心者のための基礎!ポリモーフィズムと抽象クラスの使い方を解説#29
- C#初心者のための基礎!例外Exceptionの意味と使い方をわかりやすく解説#30