Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

C#

C#のabstract(抽象クラス)とは?継承やoverrideの手順や使い方をご紹介

投稿日:2021年1月2日 更新日:

<目次>

(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」修飾子を付ける事で、実装が未完了の「不完全」の状態である事を示しており、直接そのクラスのオブジェクトを作る事はできなくなります(継承して抽象部分を実装して初めてインスタンス化できるようになる)。

■主な利用シーン
共通的な実装を共有する「テンプレート」となるクラスを定義したい場合(かつ、その抽象クラスをインスタンス化できないようにしたい場合)
(例)「時計」抽象クラスを作り、サブクラスとして「腕時計」クラスや「デジタル時計」クラスにて詳細を実装していく。

実際の例をご紹介しますと、次のような抽象クラス「Fruit」があった時に、抽象メソッド「buyPrice」がまだ実装されていない状態なので、インスタンス化しようとするとエラーになります。
 
(図111)抽象クラスを実装していないとインスタンス化不可

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) 抽象クラスの定義

メソッドやクラスの定義の前に「abstract」を付ける事により、抽象クラスとして定義できます。
(構文)

private abstaract class XXXX
{
 //抽象メソッド
 public abstract [戻り値型] [メソッド名]([引数]);
}

(例)

//(1-2-1) 抽象クラスの定義
private abstaract class Fruit
{
 //抽象メソッド
 public abstract void buyPrice(int b_price);
}

目次にもどる

(1-2-2) 抽象クラスの継承

抽象クラスを利用するには、他のクラスから継承して抽象メソッドを実装してやる必要があります。
継承をするためには次のように「class [サブクラス名] : [スーパークラス名]でクラスを定義します。

(例)

//(1-2-2) 抽象クラスの継承
//class [サブクラス名] : [スーパークラス名]
class Apple : Furit
{
 //クラスの定義
}

目次にもどる

(1-2-3) 抽象メソッドの実装(オーバーライド)

継承に加えて、上で定義した「抽象クラス」に「抽象メソッド」を実装する必要があります。ここまで行って、ようやくAppleクラスのインスタンスを作れるようになります。

(例)

//(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");
    }
  }
}

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-C#

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

C#のdynamic型とは?使いどころやvarとの違いもご紹介

  <目次> (1) C#のdynamic型とは?使いどころやvarとの違いもご紹介  (1-1) dynamic型とは?  (1-2) dynamic型の使いどころ  (1-3) 動作確認 …

C#のDB接続時のエラー(provider: Named Pipes Provider, error: 40 – Could not open a connection to SQL Server)

<目次> (1) 記事の目的  (1-1) エラー概要  (1-2) エラー原因  (1-3) エラー対策   (1-3-1) SQLServer:リモート接続を有効化   (1-3-2) SQLSe …

C#のデリゲートが分からない・・を解決!初心者向けになるべく分かり易く説明してみた

<目次> (1) C#のデリゲートが分からない・・を解決!初心者向けになるべく分かり易く説明してみた  (1-1) デリゲートとは?「関数へのポインタ」だけでは説明しきれない・・  (1-2) デリゲ …

ASP.NETでViewに値を渡す方法

  <目次> (1) ASP.NETでViewに値を渡す方法  (1-1) 方法1:アクションメソッドの引数に追加  (1-2) 方法2:ViewBagを使う方法  (1-3) 方法3:ビュ …

ソフトウェアをインストールするバッチプログラムのご紹介

  <目次> (1) ソフトウェアをインストールするバッチプログラムのご紹介  (1-1) 概要  (1-2) 構文  (1-3) サンプルプログラム  (1-4) (応用)プロキシサーバが …

  • English (United States)
  • 日本語
Top