92951


親クラスに内部クラスがある場合に、  
継承先から内部クラスのプロパティを読み書きする方法を教えていただきたいです。

[code]

    public class MainClass:ClassA{
       ClassA a = new ClassA();
       a.AAA = "OK";
       //a.classB.BBB???   //←これの読み書きがしたいがアクセスできない
    }
    
    public class ClassA{
       public string AAA{get;set;}
    
       public class ClassB{
          public string BBB{get;set;}
       }
    }
    
    
[/code]

宜しくお願い致します。


CC BY-SA 4.0
2022-12-21T08:41:31.733
92937
2022-12-22T02:59:42.810
19580
question
c#
継承元に内部クラスがある場合の内部クラス内プロパティへの書き込み、取得方法


ClassA をインスタンスしても ClassB がインスタンスされるわけではありません。  
提示されたコードのように使うには、ClassA がインスタンスされると同時に ClassB をインスタンスして公開します。

[code]

    public class ClassA
    {
        public string AAA { get; set; }
        public ClassB classB { get; } = new ClassB();
    
        public class ClassB
        {
            public string BBB { get; set; }
        }
    }
    
[/code]


CC BY-SA 4.0
2022-12-21T09:15:10.577
92939
2022-12-21T09:15:10.577
50741
92937
answer


C#は大文字と小文字を区別するため、クラス名の`ClassB`と、おそらくプロパティ名/メンバ変数名の`classB`は別物として管理されます。  
ご質問の例では他の回答にあるように`classB`のインスタンスを保存できる`classB`プロパティを作成しないとアクセスできません。

ご質問のコードでは`ClassA a = new ClassA();`を宣言して扱っているため、`MainClass`の継承元は特に使っていません。  
もし継承元の`BBB`にアクセスしたいならば`ClassA a`ローカル変数の宣言は不要です。  
継承を使う場合の具体的な実装は、サンプルコードの`AccessInnerClass`メソッドをご参照ください。

なお蛇足ではありますが、静的(static)に宣言したプロパティは `ClassB.statcBBB`のように {クラス名.プロパティ名}
でアクセス可能です。  
その他コード解説や気になった点をサンプルコードに記載しました。

**サンプルコード**

[code]

    using System;
    
    namespace ConsoleApp1
    {
        public class MainClass : ClassA
        {
            //ClassA a = new ClassA();  // これはメンバ変数の宣言なのでOK
            //a.AAA = "OK";             // メソッド外でメンバ変数の値を書き換える手続き処理はできない
            //a.classB.BBB???           // そもそもclassBが宣言されていない
    
            public static void Main(string[] args)
            {
                // クラスAのインスタンスを作成し、内部クラスのClassBにアクセスする例
                // ※継承とは関係ありません
                ClassA a = new ClassA();
                a.AAA = "OK";
                a.classB = new ClassB() { BBB = "Initialize" }; // オブジェクト初期化子でBBBに書き込み
                Console.WriteLine(a.classB.BBB);                // BBB読み込み
                ClassA.ClassB.staticBBB = "KO";   // {クラス名.プロパティ名} でアクセス可能
                // a.ClassB.staticBBB = "NG";     // この構文はコンパイルエラー
    
                // 継承版
                new MainClass().AccessInnerClass();
            }
    
            /// <summary>
            /// Mainクラスのインスタンスから継承元のclassBにアクセスする例
            /// </summary>
            /// <remarks>
            /// メソッド内の this. は省略可能だが、回答を分かりやすくするため明示的に記述している
            /// </remarks>
            private void AccessInnerClass()
            {
                this.classB = new ClassB();             // 継承元のclassBプロパティにはアクセス可能
                this.classB.BBB = "SET";                // 継承元の内部クラスの BBB 書き込み
                Console.WriteLine(this.classB.BBB);     // 継承元の内部クラスの BBB 読み込み
                Console.WriteLine(ClassB.staticBBB);    // 継承元の内部クラスの静的な staticBBB 読み込み
            }
        }
    
        public class ClassA
        {
            public string AAA { get; set; }
            public ClassB classB { get; set; }  // classBプロパティを宣言
    
            public class ClassB
            {
                public string BBB { get; set; }
                // 静的(static)に宣言したプロパティは {クラス名.プロパティ名} でアクセスできる
                public static string staticBBB { get; set; }
            }
        }
    }
    
[/code]


CC BY-SA 4.0
2022-12-22T02:59:42.810
92951
2022-12-22T02:59:42.810
9820
92937
answer