【C#】「メソッドのオーバーライド」派生クラスで基本クラスと同じ名前のメソッドの中身を変える

メソッドのオーバーライドとは、基本クラスと同じ名前のメソッドを、派生クラスごとに中身が違うメソッドにすることです。
同じ名前のメソッドでシグニチャの違うものを定義するオーバーロードとは名前が似ていますが違うものなのでご注意ください。

仮想メソッドとオーバーライドメソッド

オーバーライド元の基本クラスのメソッドを仮想メソッドといいます。
オーバーライドする派生クラスのメソッドをオーバーライドメソッドといいます。

メソッドのオーバーライドの構文

オーバーライドするには、基本クラスのメソッドのアクセス修飾子の後にvirtualキーワードをつけます。
次に、オーバーライドさせる派生クラスのメソッドのアクセス修飾子の後にoverrideキーワードをつけます。
仮想メソッドとオーバーライドメソッドは同じアクセス修飾子、シグニチャ(メソッド名と引数)になっている必要があります。
staticをつけた静的メソッドのオーバーライドはできません。

class 基本クラス名 //基本クラス
{
 アクセス修飾子 virtual 戻り値の型 メソッド名() //仮想メソッド virtualをつける
 {
  処理1;
 }
}
class 派生クラス名 : 基本クラス名 //派生クラス1 { アクセス修飾子 override 戻り値の型 メソッド名() //オーバーライドメソッド1 overrideをつける { 処理2; } }
class クラス名 { static void Main() { 基本クラス名 変数名1 = new 基本クラス名(); //基本クラスをオブジェクト化 変数名1.メソッド名(); //基本クラスの仮想メソッドの呼び出し
派生クラス名 変数名2 = new 派生クラス名(); //派生クラスをオブジェクト化 変数名2.メソッド名(); //派生クラスのオーバーライドメソッドの呼び出し
Console.WriteLine("{0},{1}", 変数名1, 変数名2); } }

基本クラスで仮想メソッドの処理1を書き、派生クラスでオーバーライドメソッドの処理2を書いています。
実行すると、基本クラスの仮想メソッドと派生クラスのオーバーライドしたメソッドの「処理1」と「処理2」が実行された結果が表示されます。

メソッドのオーバーライドの例

class TestClass1 //基本クラス
{
 public virtual void Test1() //仮想メソッド virtualをつける
 {
  Console.WriteLine("仮想メソッド");
 }
}
class TestClass2 : TestClass1 //派生クラス1 { public override void Test1() //オーバーライドメソッド1 overrideをつける { Console.WriteLine("オーバーライドメソッド1"); } }
class Program { static void Main() { TestClass1 a = new TestClass1(); //基本クラスをオブジェクト化 a.Test1();
TestClass2 b = new TestClass2(); //派生クラスをオブジェクト化 b.Test1();
Console.WriteLine("{0},{1}", a, b); } }

例を実行するとコマンドプロントに
「仮想メソッド」
「オーバーライドメソッド1」
と表示されます。
仮想メソッドとオーバーライドメソッドは「Test1()」という同じ名前のメソッドですが、Console.WriteLineの中身が変わっていることが分かります。