【C#】「プロパティのオーバーライド」

プロパティのオーバーライドとは、基本クラスと派生クラスで同じ名前のプロパティだけど中身を変えて指定することです。

プロパティのオーバーライドの構文

プロパティのオーバーライドをするには基本クラスのプロパティにvirtualをつけ、派生クラスのプロパティにoverrideをつけます。

class クラス名
    {
        アクセス修飾子 virtual データ型 変数名
        {
            get
            {
                return 変数名;
            }
            set
            {
                変数名 = value;
            }
        }
    }
class 派生クラス名 : 基本クラス名 { アクセス修飾子 override データ型 変数名 { get { return 変数名; } set { 変数名 = value; } }

プロパティのオーバーライドの例

using System;
namespace ConsoleApplication1 { class Program1 { static void Main() { Animal1 m;
Animal1 animal1 = new Animal1(); Animal2 animal2 = new Animal2();
m = animal1; Console.WriteLine("{0}", m.Msg); //obj.MsgでプロパティMsgの値を取得
m = animal2; Console.WriteLine("{0}", m.Msg); //obj.MsgでプロパティMsgの値を取得
Console.ReadLine(); //キーを押すまでコマンドプロントを終了させない } }
class Animal1 { public String msg = "猫1"; public virtual String Msg { get { return msg; } } }
class Animal2 : Animal1 { public String msg = "猫2"; public override String Msg { get { return msg; } } } }

例を実行するとコマンドプロントに「猫1、猫2」と表示されます。
ちなみにvirtualとoverrideを消して実行すると「猫1、猫1」と表示されます。
派生クラスで同じ名前のプロパティをオーバーロードしていないので、animal2のプロパティMsgがanimal1のプロパティMsgと同じものになっているからです。

プロパティのオーバーライドをしなくても同名のプロパティの値を取得できる

プロパティのオーバーライドをしなくても、基本クラスと派生クラスで同じ名前のプロパティの値を取得することはできます。

using System;
namespace ConsoleApplication1
{
    class Program1
    {
        static void Main()
        {
            Animal1 animal1 = new Animal1();
            Animal2 animal2 = new Animal2();
Console.WriteLine("{0}", animal1.Msg); //obj.MsgでプロパティMsgの値を取得 Console.WriteLine("{0}", animal2.Msg); //obj.MsgでプロパティMsgの値を取得 Console.ReadLine(); //キーを押すまでコマンドプロントを終了させない } }
class Animal1 { public String msg = "猫1"; public String Msg { get { return msg; } } }
class Animal2 : Animal1 { public String msg = "猫2"; public String Msg { get { return msg; } } } }

例を実行するとコマンドプロントに「猫1、猫2」と表示されます。
直接プロパティにアクセスしているので、プロパティの名前が同じでも値を取得できます。
しかし、プロパティのオーバーライドで説明した通り、変数を定義してその変数にanimal1とanimal2を代入して呼び出すとオーバーライドしていないので、「猫1、猫1」と表示されてしまいます。