none
基底クラスのreadonlyメンバを、派生クラスのコンストラクタで書くことはできないのでしょうか? RRS feed

  • 質問

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

    class Parson

    {

           string hoge;

    }

    class Child:Parson

    {

         Child()

        {

              hoge = "test";

     

    }

    のように、基底クラスのhogeの処理方法は派生クラスごとにことなるので、

    派生クラス側で実装したいと考えています。

    readonlyメンバはコンストラクタで初期化できる、とのことですが、

    試してみたところ、うまくいきませんでした。

    とりあえずreadonlyを外せば動きますが、本質的にはreadonlyのものですのでreadonlyで実装したいです。

     

    どなたか解決法をご存知でしょうか。

    2010年7月10日 9:31

回答

  • こんな感じで。

     

    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
    2010年7月10日 9:57
  • 派生クラスから初期化できない理由は、派生のコンストラクタが呼ばれた段階で基底クラスのコンストラクタは終了しており、以降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
    2010年7月10日 13:14

すべての返信

  • こんな感じで。

     

    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
    2010年7月10日 9:57
  • 派生クラスから初期化できない理由は、派生のコンストラクタが呼ばれた段階で基底クラスのコンストラクタは終了しており、以降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
    2010年7月10日 13:14
  • Hongliangsさん、佐祐理さん、回答ありがとうございます。

    佐祐理さんの回答は興味深いですね。
    動的に変える物ではないので、佐祐理さんの回答を使ってみようと思います。


    ありがとうございました。
    2010年7月10日 15:44