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# クラスの継承の仕組みとサンプル