メソッドのオーバーライドとは、基本クラスと同じ名前のメソッドを、派生クラスごとに中身が違うメソッドにすることです。
同じ名前のメソッドでシグニチャの違うものを定義するオーバーロードとは名前が似ていますが違うものなのでご注意ください。
仮想メソッドとオーバーライドメソッド
オーバーライド元の基本クラスのメソッドを仮想メソッドといいます。
オーバーライドする派生クラスのメソッドをオーバーライドメソッドといいます。
メソッドのオーバーライドの構文
オーバーライドするには、基本クラスのメソッドのアクセス修飾子の後に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の中身が変わっていることが分かります。