読者です 読者をやめる 読者になる 読者になる

雑記 - otherwise

最近はDQ10しかやっていないダメ技術者がちまちまと綴る雑記帳

継承クラスに対して親クラスで定義された static プロパティを更新する場合の影響範囲

C#

今まで動きを勘違いしていた(と云うかちゃんと認識出来ていなかった)のでメモ。
親クラスで定義された static プロパティについて、継承クラスに対して値をセットすると、親クラス側(とその親クラスを継承している別のクラス)の値も更新されるんですね。
# 「親クラスの値を共有する」と言った方が正しいですかね。
で、この伝播を断ち切りたい場合、継承クラス側でプロパティを隠蔽する必要がある、と。

using System;

class Foo {
  public static string Hoge { get; set; }
  public static string Fuga { get; set; }
  
  static Foo() {
    Hoge = "Foo(Hoge)";
    Fuga = "Foo(Fuga)";
  }
}

class Bar : Foo {
  public new static string Fuga { get; set; }
}

class Baz : Foo {
  public new static string Fuga { get; set; }
}

class Qux {
  static void Main() {
    Bar.Hoge = "Bar(Hoge)";
    Baz.Hoge = "Baz(Hoge)";
    Bar.Fuga = "Bar(Fuga)";
    Baz.Fuga = "Baz(Fuga)";
    Console.WriteLine("Foo: Hoge = {0}, Fuga = {1}", Foo.Hoge, Foo.Fuga);
    Console.WriteLine("Bar: Hoge = {0}, Fuga = {1}", Bar.Hoge, Bar.Fuga);
    Console.WriteLine("Baz: Hoge = {0}, Fuga = {1}", Baz.Hoge, Baz.Fuga);
  }
}
Foo: Hoge = Baz(Hoge), Fuga = Foo(Fuga)
Bar: Hoge = Baz(Hoge), Fuga = Bar(Fuga)
Baz: Hoge = Baz(Hoge), Fuga = Baz(Fuga)

# とあるライブラリを作成していて、ふと気になって調べてみたら。。。
# ……自作ライブラリの実装を変えないと><