Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C#

Nested Classes (คลาสซ้อน) ใน C#

Nested Class คือ คลาสที่ประกาศอยู่ภายในคลาสอื่น (Enclosing Class) เป็นสมาชิกของคลาสภายนอก สามารถเข้าถึงสมาชิก private ของคลาสภายนอกได้

ลักษณะสำคัญ

  • เป็น Member ของ Enclosing Class — ควบคุม Access modifier ได้ (private, public, protected, internal)
  • เข้าถึง private members ของคลาสภายนอกได้ (แตกต่างจากคลาสทั่วไป)
  • คลาสภายนอก ไม่สามารถเข้าถึง private members ของ Nested Class ได้ (except ผ่าน instance)
  • สร้าง Instance ผ่านชื่อเต็ม: OuterClass.NestedClass instance = new OuterClass.NestedClass();

ตัวอย่างโค้ด

using System;

class Outer {
    private int outerPrivate = 100;
    public int outerPublic = 200;
    
    // Nested class
    public class Nested {
        public int nestedValue = 300;
        
        public void AccessOuter(Outer outer) {
            // เข้าถึง private ของ Outer ได้!
            Console.WriteLine("Outer private: " + outer.outerPrivate);
            Console.WriteLine("Outer public: " + outer.outerPublic);
        }
    }
    
    public void Demo() {
        var nested = new Nested();
        // nested.nestedValue เข้าถึงได้ (public)
        // nested.outerPrivate ❌ เข้าถึงไม่ได้ — private ของ Nested
    }
}

class Program {
    static void Main() {
        Outer outer = new Outer();
        Outer.Nested nested = new Outer.Nested(); // สร้าง instance แบบเต็ม
        
        nested.AccessOuter(outer);
        Console.ReadKey();
    }
}

กรณีการใช้งาน (Use Cases)

สถานการณ์เหตุผล
Implementation Detailซ่อนคลาส Helper ที่ใช้เฉพาะคลาสภายนอก
Builder PatternNested Builder class เข้าถึง private constructor ได้
Event ArgumentsEventArgs เฉพาะ Event นั้น
Iterator/EnumeratorPrivate iterator implementation

Static Nested Class

ถ้า Nested Class ไม่ต้องเข้าถึง Instance members ของ Outer ให้ทำเป็น static:

class Outer {
    public static class NestedStatic {
        public static void Helper() { } // ไม่ต้อง new Outer()
    }
}
// เรียก: Outer.NestedStatic.Helper();

สรุป

  • Nested Class = Encapsulation ระดับคลาส
  • เข้าถึง Private ของ Outer ได้ → เหมาะสำหรับ Implementation hiding
  • ใช้ static ถ้าไม่ต้องการ Instance context