C# 抽象クラスと抽象メソッドのサンプル(abstract)

C#の抽象クラスと抽象メソッドのサンプルです。

確認環境
・Microsoft Visual Studio Community 2017

目次

抽象クラスと抽象メソッド

アクセス修飾子 abstract  class  クラス名 {
  アクセス修飾子 abstract 戻り値の型 メソッド名(引数){ // ←抽象メソッドです
   }
}
  • 抽象クラスと抽象メソッドは、abstractというキーワードを指定します。
  • 抽象メソッドは、メソッドの定義はしますが、処理内容は記述しません。
    →処理内容は、抽象クラスを継承したクラスで記述します。
    →抽象メソッドを上書きするのでオーバーライドになります。
  • 抽象クラスを継承する場合、継承先のクラスはコロン(:)の後に抽象クラスを指定します。
    →継承した側のクラスから見て継承できる抽象クラスは1つのみです。
  • 抽象メソッドが1つでもあると抽象クラスになり、クラスの前にabstractをつけます。
  • インスタンスの生成で、代入する変数の型を抽象クラスにすることも可能です。その場合、指定した抽象クラスのメソッドのみ使用できます。
  • 抽象クラス自体はインスタンス化できません。

コード

抽象クラスと抽象メソッドのサンプルです。

using System;

namespace Project1
{
    public abstract class AbstractTest
    {
        public abstract void Print1();
    }
    public class TestA : AbstractTest
    {
        public override void Print1()
        {
            Console.WriteLine("test1");
        }
    }
class Test1
    {
        static void Main()
        {
            TestA s1 = new TestA();
            s1.Print1(); //test1
        }
    }
}

5行目は、クラスの前にabstractがついています。抽象クラスです。
7行目は、メソッドの前にabstractがついています。抽象メソッドです。抽象メソッドには処理内容を記述しません。
9行目は、コロン(:)の後に抽象クラス名を指定して抽象クラスを継承しています。
11行目は、抽象クラスメソッドをオーバーライドしています。overrideのキーワードがあります。メソッドの具体的な処理内容を記述します。
21行目は、11行目のメソッドが実行されます。

変数の型が抽象クラスの場合

変数の型が抽象クラスの場合のサンプルです。

using System;

namespace Project1
{
    public abstract class AbstractTest
    {
        public abstract void Print1();
    }
    public class TestA : AbstractTest
    {
        public override void Print1()
        {
            Console.WriteLine("test1");
        }
        public void Print2()
        {
            Console.WriteLine("test2");
        }
    }
    class Test1
    {
        static void Main()
        {
            AbstractTest s1 = new TestA();
            s1.Print1(); //test1
//            s1.Print2(); //test2
        }
    }
}

24行目の変数の型は、抽象クラスの型(AbstractTest)です。
25行目のPrint1メソッドは、抽象クラスにあるので実行できます。
26行目のPrint2メソッドは、抽象クラスにないのでコンパイルエラーになります。

抽象クラスの中に通常のメソッドを記述する

抽象クラスの中に通常のメソッドを記述することは可能です。

using System;

namespace Project1
{
    public abstract class AbstractTest
    {
        public abstract void Print1();
        public void Print2()
        {
            Console.WriteLine("test2");
        }
    }
    public class TestA : AbstractTest
    {
        public override void Print1()
        {
        }
    }
    class Test1
    {
        static void Main()
        {
            TestA s1 = new TestA();
            s1.Print2(); //test2
        }
    }
}

8~11行目は、抽象クラスの中に通常のメソッドがあります。
24行目は、抽象クラスにある通常のメソッドを実行しています。

抽象クラスの中に通常のフィールド変数を記述する

抽象クラスの中に通常のフィールド変数を記述することも可能です。

using System;

namespace Project1
{
    public abstract class AbstractTest
    {
        public int num = 1;
        public abstract void Print1();
    }
    public class TestA : AbstractTest
    {
        public override void Print1()
        {
        }
    }
    class Test1
    {
        static void Main()
        {
            TestA s1 = new TestA();
            Console.WriteLine(s1.num); //1
        }
    }
}

7行目は、抽象クラスの中に通常のフィールド変数があります。
21行目は、抽象クラスにある通常のフィールド変数の値を表示しています。

関連の記事

C# インターフェースのサンプル(interface)
C# クラスの仕組みと使い方のサンプル
C# コンストラクタのサンプル
C# クラスの継承のサンプル

△上に戻る