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 Pattern | Nested Builder class เข้าถึง private constructor ได้ |
| Event Arguments | EventArgs เฉพาะ Event นั้น |
| Iterator/Enumerator | Private 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