トップ回答者
基底クラスのreadonlyメンバを、派生クラスのコンストラクタで書くことはできないのでしょうか?

質問
-
基底クラスのreadonlyメンバを、派生クラスのコンストラクタで書くことはできないのでしょうか?
class Parson
{
string hoge;
}
class Child:Parson
{
Child()
{
hoge = "test";
}
のように、基底クラスのhogeの処理方法は派生クラスごとにことなるので、
派生クラス側で実装したいと考えています。
readonlyメンバはコンストラクタで初期化できる、とのことですが、
試してみたところ、うまくいきませんでした。
とりあえずreadonlyを外せば動きますが、本質的にはreadonlyのものですのでreadonlyで実装したいです。
どなたか解決法をご存知でしょうか。
回答
-
こんな感じで。
public class Base { protected Base(string name) { this.name = name; } protected readonly string name; } public class Derived : Base { public Derived() : base("Derived") { } }
- 回答としてマーク sauberwind 2010年7月10日 15:17
-
派生クラスから初期化できない理由は、派生のコンストラクタが呼ばれた段階で基底クラスのコンストラクタは終了しており、以降readonlyとなるため です。
対策として私もそう書くこともあります。
ただ、こうした方が意味的に適切な場合もあります。public abstract class Base{
protected abstract string Name{ get; }
}
public Derived: Base{
protected override string Name{
get{
return "Derived";
}
}
}- 回答としてマーク sauberwind 2010年7月10日 15:17
すべての返信
-
こんな感じで。
public class Base { protected Base(string name) { this.name = name; } protected readonly string name; } public class Derived : Base { public Derived() : base("Derived") { } }
- 回答としてマーク sauberwind 2010年7月10日 15:17
-
派生クラスから初期化できない理由は、派生のコンストラクタが呼ばれた段階で基底クラスのコンストラクタは終了しており、以降readonlyとなるため です。
対策として私もそう書くこともあります。
ただ、こうした方が意味的に適切な場合もあります。public abstract class Base{
protected abstract string Name{ get; }
}
public Derived: Base{
protected override string Name{
get{
return "Derived";
}
}
}- 回答としてマーク sauberwind 2010年7月10日 15:17