(1) C#の抽象クラスやabstractとは?意味や使い方をご紹介
(1-1) 抽象クラスとは?
(1-2) 抽象クラスの使い方
(1-2-1) 抽象クラスの定義
(1-2-2) 抽象クラスの継承
(1-2-3) 抽象メソッドの実装(オーバーライド)
(1-2-4) メソッドの呼び出し(実行)
(1-2-5) 付録:プログラム全体
(1) C#の抽象クラスやabstractとは?意味や使い方をご紹介
C#のプログラムを見ていて、次のような記述を目にした事はありますでしょうか?
(例)抽象クラスと抽象メソッド
private abstaract class XXXX { public abstract bool XXXX(string[] XXXX); }
このabstractが付いたクラスやメソッドは「抽象クラス」や「抽象メソッド」と呼ばれており、本記事ではこれらの意味や用途について、なるべく分かり易くご紹介します。
(1-1) 抽象クラスとは?
内部的な詳細を隠して、機能性のみを公開するためのクラスです。「abstract」修飾子を付ける事で、実装が未完了の「不完全」の状態である事を示しており、直接そのクラスのオブジェクトを作る事はできなくなります(継承して抽象部分を実装して初めてインスタンス化できるようになる)。
■主な利用シーン
共通的な実装を共有する「テンプレート」となるクラスを定義したい場合(かつ、その抽象クラスをインスタンス化できないようにしたい場合)
(例)「時計」抽象クラスを作り、サブクラスとして「腕時計」クラスや「デジタル時計」クラスにて詳細を実装していく。
abstract class Fruit { public abstract void buyPrice(int b_price); public void sellPrice(int s_price) { Console.WriteLine("The fruit is sold in "+s_price+" yen"); } }
これをそのままインスタンス化しようとすると次のようにエラーとなります。
//エラーになる Fruit fr = new Fruit();
具体的には次のようなエラーが出ると思います。
エラー CS0144 抽象クラスまたはインターフェイス 'XXXXX' のインスタンスを作成できません。
以降の節では、この抽象クラスの使い方について順を追って見ていきます。
(1-2) 抽象クラスの使い方
(1-2-1) 抽象クラスの定義
(構文)
private abstaract class XXXX { //抽象メソッド public abstract [戻り値型] [メソッド名]([引数]); }
(例)
//(1-2-1) 抽象クラスの定義 private abstaract class Fruit { //抽象メソッド public abstract void buyPrice(int b_price); }
(1-2-2) 抽象クラスの継承
(例)
//(1-2-2) 抽象クラスの継承 //class [サブクラス名] : [スーパークラス名] class Apple : Furit { //クラスの定義 }
(1-2-3) 抽象メソッドの実装(オーバーライド)
(例)
//(1-2-3) 抽象メソッドの実装(オーバーライド) public override void buyPrice(int b_price) { //メソッド処理内容 Console.WriteLine("This Apple is bought in "+b_price+" yen"); }
ここまでの3ステップの内容を纏めて書いたのが次のプログラムになります。
(サンプルプログラム:パート1)
抽象クラス定義+抽象クラスの継承+抽象メソッドの実装
//(1-2-1) 抽象クラスの定義 abstract class Fruit { public abstract void buyPrice(int b_price); public void sellPrice(int s_price) { Console.WriteLine("The fruit is sold in "+ s_price + " yen"); } } //(1-2-2) 抽象クラスの継承 class Apple : Fruit { //(1-2-3) 抽象メソッドの実装(オーバーライド) public override void buyPrice(int b_price) { Console.WriteLine("This Apple is bought in " + b_price + " yen"); } }
(1-2-4) メソッドの呼び出し(実行)
最後に実際にメソッドを呼び出してみます。Appleクラスのインスタンスを作って、そこからfruitsColor()抽象メソッドを呼び出しています。
(サンプルプログラム:パート2)
パート1を呼び出すMain文のプログラムです。
class Program { static void Main(string[] args) { //①Appleクラスのインスタンス作成 Apple ap = new Apple(); //②抽象メソッドの呼び出し ap.buyPrice(198); } }
(図124)実行結果
(1-2-5) 付録:プログラム全体
最後にパート1とパート2を繋げたプログラム全体のサンプルを掲載します(実際に実行したプログラムそのまま)。
(付録)
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace RP_IT0215_AbstractClassTest { class Program { static void Main(string[] args) { Apple ap = new Apple(); ap.buyPrice(198); } } abstract class Fruit { public abstract void buyPrice(int b_price); public void sellPrice(int s_price) { Console.WriteLine("The fruit is sold in "+ s_price + " yen"); } } class Apple : Fruit { public override void buyPrice(int b_price) { Console.WriteLine("This Apple is bought in " + b_price + " yen"); } } }