工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> C言語

C# 入れ子クラスを理解する:定義、使用法、継承

C# 入れ子クラスを理解する

実例で示すベストプラクティスとともに、C# で入れ子クラスを定義、アクセス、継承する方法を探求します。

C# ではクラスを別のクラス内で宣言できます。内側の型を入れ子クラスと呼びます。例:

class OuterClass {
    // 外側のメンバー
    class InnerClass {
        // 内側のメンバー
    }
}

この例では InnerClass が OuterClass 内に作成されます。アクセス修飾子が許可しない限り、内側の型は外側の型内でのみ可視です。


入れ子クラスのメンバーへのアクセス

入れ子型を扱うには、まず各クラスを別々にインスタンス化します。

1. 外側のクラスのインスタンスを作成

OuterClass outer = new OuterClass();

ここでは outer が OuterClass のオブジェクトです。

2. 入れ子クラスのインスタンスを作成

OuterClass.InnerClass inner = new OuterClass.InnerClass();

InnerClass が OuterClass 内にネストされているため、外側の型名で修飾します。

インスタンス化後、オブジェクト参照を通じてメンバーを呼び出せます。

例:メソッドを持つ入れ子クラス

using System;
namespace NestedClassDemo {
    public class Car {
        public void DisplayCar() => Console.WriteLine("Car: Bugatti");
        public class Engine {
            public void DisplayEngine() => Console.WriteLine("Engine: Petrol Engine");
        }
    }
    class Program {
        static void Main(string[] args) {
            Car sportsCar = new Car();
            sportsCar.DisplayCar();
            Car.Engine petrolEngine = new Car.Engine();
            petrolEngine.DisplayEngine();
            Console.ReadLine();
        }
    }
}

出力

Car: Bugatti
Engine: Petrol Engine

外側の Car と入れ子の Engine のオブジェクトを作成し、それぞれのメソッドを呼び出す方法を示しています。

外側のインスタンスから直接入れ子型のメソッドを呼ぶことはできません:

// 無効
sportsCar.DisplayEngine();

入れ子クラスから外側のクラスメンバーへのアクセス

入れ子クラスは含む型のメンバーを参照できます。外側の型のインスタンスや、静的メンバーなら外側の型名を使用します。

インスタンスを使用してインスタンスメンバーにアクセス

using System;
namespace NestedClassDemo {
    public class Car {
        public string Brand = "Bugatti";
        public class Engine {
            public void ShowBrand() {
                Car car = new Car();
                Console.WriteLine("Brand: " + car.Brand);
            }
        }
    }
    class Program {
        static void Main(string[] args) {
            Car.Engine engine = new Car.Engine();
            engine.ShowBrand();
            Console.ReadLine();
        }
    }
}

出力

Brand: Bugatti

インスタンス化なしで静的メンバーにアクセス

using System;
namespace NestedClassDemo {
    public class Car {
        public static string Brand = "Bugatti";
        public class Engine {
            public void ShowBrand() {
                Console.WriteLine("Brand: " + Car.Brand);
            }
        }
    }
    class Program {
        static void Main(string[] args) {
            Car.Engine engine = new Car.Engine();
            engine.ShowBrand();
            Console.ReadLine();
        }
    }
}

出力

Brand: Bugatti

入れ子クラスを伴う継承

入れ子クラスも他の型と同様に継承に参加できます。

外側のクラスから派生

using System;
namespace NestedClassDemo {
    class Computer {
        public void Display() => Console.WriteLine("Method of Computer class");
        public class CPU {
            // 追加メンバーをここに配置可能
        }
    }
    class Laptop : Computer {
        // Laptop は Computer のすべてのメンバーを継承
    }
    class Program {
        static void Main(string[] args) {
            Laptop laptop = new Laptop();
            laptop.Display();
            Console.ReadLine();
        }
    }
}

出力

Method of Computer class

入れ子クラスから派生

using System;
namespace NestedClassDemo {
    class Computer {
        public class CPU {
            public void Display() => Console.WriteLine("Method of CPU class");
        }
    }
    class Laptop : Computer.CPU {
        // Laptop は Computer.CPU のメンバーを継承
    }
    class Program {
        static void Main(string[] args) {
            Laptop laptop = new Laptop();
            laptop.Display();
            Console.ReadLine();
        }
    }
}

出力

Method of CPU class

入れ子クラスを継承する際は、外側のクラス名で型を修飾する必要があります(例:Computer.CPU)。

C言語

  1. C# クラスとオブジェクト:堅牢な OOP の基礎
  2. C# アクセス修飾子を理解する:public、private、protected、internal など
  3. C# コンストラクター:種類、例、高度なパターン
  4. C# static キーワード:静的変数、メソッド、クラスをマスターする
  5. C# 抽象クラスと抽象メソッドをマスターする:実践ガイド
  6. C# 入れ子クラスを理解する:定義、使用法、継承
  7. C# 部分クラスと部分メソッドを理解する
  8. C# sealed クラスとメソッドをマスターする:使用判断、実例、コードの安全性とパフォーマンス向上
  9. C#コンストラクタオーバーロード完全ガイド:柔軟なクラス設計
  10. C++ポリモーフィズム完全理解:仮想関数と純粋仮想関数
  11. C++データ抽象化完全マスター:インターフェースと実装の分離