C#:staticなメンバ変数は派生クラスでどう扱われる?
クラスのメンバ変数をstaticで定義しておくと、そのクラスから生成したオブジェクト全てで一つ共通の領域の変数を持つことになる。つまり、どれか一つのオブジェクトからそのstaticなメンバ変数の値を変更すると、すべてのオブジェクトで変更した値を参照できるわけです。
この仕様を用いてSingletonパターンを作ったりするのだ。
では、staticな変数を親クラスが持っていて、そのクラスから派生した子クラスは、親クラスのstaticなメンバ変数を書き換えるとどうなるか、と思った次第で。
というわけで、C#で検証してみた。
#ちなみにformに張り付けてボタンを押して試したんよ。
public class Class1
{
static private int test_ = 1;
public int test
{
get { return test_; }
set { test_ = value; }
}
}
public class Class1_1 : Class1
{
public int test1;
}
public class Class1_2 : Class1
{
public int test1;
}
private void button1_Click(object sender, EventArgs e)
{
Class1 obj1 = new Class1_1();
obj1.test = 2;
Class1 obj2 = new Class1_2();
}
Class1_1のオブジェクトobj1のtestプロパティで2を設定している。
次に生成したClass1_2のオブジェクトobj2の中身をデバッガで覗いてみるとtest_メンバ変数には2となっていることが確認できた。
Class1のstaticなtest_メンバ変数は、初期値1を設定しているのだが、それが2になっていることは、staticなメンバ変数は派生クラスでも同じ値を持つことですね。
ま、考えてみれば、staticなメンバ変数はどっかの領域が一つ取られて、そのスコープの中(つまりクラス)から参照・更新できるってわけだから、派生クラスのオブジェクトで値を変更することで一つしかない領域の値が書き換わり、他のオブジェクトはその一つしかない領域を見に行くって訳なのは当たり前ですな。
« しゃべるな!マナジーが無くなるぞ! | トップページ | 京急の鉄道むすめ »
コメント