Nested classes
ญาณิศา ประทุมสุวรรณ์ 650710539
คลาสซ้อน(nested class) คือ คลาสที่ประกาศอยู่ภายในอีกคลาส จุดประสงค์ของคลาสซ้อนเป็นการจัดกลุ่มคลาสที่อยู่ด้วยกัน ซึ่งทำให้โค้ดของคุณสามารถอ่านง่ายและบำรุงรักษาได้มากขึ้น

Overview
ตัวอย่างเช่น class Car (OuterClass) ที่มี class Engine (InnerClass) ซ้อนอยู่ข้างใน
รถแต่ละคันจะมีเครื่องยนต์ที่แตกต่างกันไป
using System;
namespace CsharpNestedClass {
// outer class
public class Car {
public void displayCar() {
Console.WriteLine("Car: Bugatti");
}
// inner class
public class Engine {
public void displayEngine() {
Console.WriteLine("Engine: Petrol Engine");
}
}
}
class Program {
static void Main(string[] args) {
// create object of outer class
Car sportsCar = new Car();
// access method of outer class
sportsCar.displayCar();
// create object of inner class
Car.Engine petrolEngine = new Car.Engine();
// access member of inner class
petrolEngine.displayEngine();
Console.ReadLine();
}
}
}
Nested Type: Non-static
ระดับการเข้าถึง Defaultจะเป็นprivate
public class Container
{
class Nested
{
Nested() { }
}
}
เพื่อให้คลาสอื่นเข้าถึงได้นอกจากคลาสContainer เราจะเปลี่ยนคลาสNestedเป็น public และเพื่อให้คลาสอื่นสร้างobjectได้เราจะเปลี่ยนconstructorเป็นpublicด้วย
public class Container
{
public class Nested
{
public Nested() {Console.WriteLine("Public Nested class constructor called"); }
}
}
Access Modifiers ตัวอื่นๆที่Nested Classสามารถใช้ได้: protected, internal, protected internal, private, private protected
สำหรับ protected, protected internal, private protected สามารถเข้าถึงได้เฉพาะคลาสลูกที่Inheritคลาส OuterClassเท่านั้น
public class OuterClass
{
private class NestedClass
{ // private สร้างอินสแตนซ์ในOuterClass
public void ShowMessage()
{
Console.WriteLine("Hello from private NestedClass");
}
}
public void AccessNestedClass()
{
NestedClass nested = new NestedClass();
nested.ShowMessage();
}
}
class Program
{
static void Main()
{
OuterClass outer = new OuterClass();
outer.AccessNestedClass();
}
}
Nested Type: Static
public class Container
{
public static class Nested
{
public static void DisplayMessage()
{
Console.WriteLine("Static Nested class method called");
}
}
}
public class Program
{
public static void Main()
{
Container.Nested.DisplayMessage();
}
}
ไม่จำเป็นต้องสร้างอินสแตนซ์ของ Container เพื่อใช้งาน Nested
Access Outer Class Members Inside Inner Class
คลาสชั้นในสามารถเข้าถึงแอตทริบิวต์และเมธอดของคลาสภายนอกได้
using System;
public class OuterClass
{
public int x = 10;
public class InnerClass
{
public int MyInnerMethod()
{
return new OuterClass().x;
}
}
}
public class MainClass
{
public static void Main(string[] args)
{
OuterClass myOuter = new OuterClass();
OuterClass.InnerClass myInner = new OuterClass.InnerClass();
Console.WriteLine(myInner.MyInnerMethod());
}
}
Nested Classes in Java

ในภาษาJavaแบ่งกว้างๆได้เป็น 2 ประเภทเช่นเดียวกับในภาษาC# คือ Static และ Non-static

Non-static มีคลาสพิเศษ 2 ชนิด
Local Classes
java: รองรับการประกาศคลาสภายในเมธอด โดยคลาสที่อยู่ภายในเมธอดสามารถเข้าถึงตัวแปรภายในเมธอดได้ (ถ้าตัวแปรนั้นเป็น final หรือ effectively final)
public class OuterClass {
void myMethod() {
int num = 10;
class LocalClass {
void printNumber() {
System.out.println("Value of num: " + num);
}
} //คลาสLocalClassประกาศอยู่ในเมธอดmyMethod สามารถเข้าถึงตัวแปรnumได้
LocalClass local = new LocalClass();
local.printNumber();
}
public static void main(String args[]) {
OuterClass outer = new OuterClass();
outer.myMethod();
}
}
C#: ไม่มีการรองรับการประกาศคลาสภายในเมธอด แต่สามารถใช้ local function ซึ่งเป็นฟังก์ชันที่ประกาศภายในเมธอดได้ และ local function นี้สามารถเข้าถึงตัวแปรใน scope เดียวกันได้
using System;
public class OuterClass
{
public void MyMethod()
{
int num = 10;
void LocalFunction()
{
Console.WriteLine("Value of num: " + num);
}
LocalFunction();
}
public static void Main(string[] args)
{
OuterClass outer = new OuterClass();
outer.MyMethod();
}
}
Anonymous Classes
Java: anonymous inner class คือวิธีการสร้าง instance ของคลาส (มักจะเป็น interface หรือ abstract class) โดยไม่ต้องตั้งชื่อ มักจะใช้ในการจัดการเหตุการณ์ (events) หรือสร้าง object ขนาดเล็ก
public class TestClass
{
private void TestMethod()
{
MyInterface localVar = new MyInterface() //สร้างAnonymous Class
{
public void method1()
{
someCode();
}
public void method2(int i, boolean b)
{
someCode();
}
}; //override เมธอด method1 และ method2
}
}
C#: ไม่มีการรองรับ anonymous inner class โดยตรง แต่สามารถทำสิ่งที่คล้ายกันได้โดยใช้ คลาส private หรือ lambda (สำหรับ functional interfaces หรือ delegates)
public class TestClass
{
private void TestMethod()
{
MyInterface localVar = new MyInterfaceAnonymousInnerClass(this);
} //TestMethodมีการสร้าง instance ของคลาส MyInterfaceAnonymousInnerClass
//โดยส่งออบเจ็กต์ของ TestClass ไปให้คอนสตรัคเตอร์ของ MyInterfaceAnonymousInnerClass
private class MyInterfaceAnonymousInnerClass : MyInterface
{ //Anonymous ของโค้ดนี้คือ MyInterfaceAnonymousInnerClass
private readonly TestClass outerInstance;
public MyInterfaceAnonymousInnerClass(TestClass outerInstance)
{
this.outerInstance = outerInstance;
}
public void method1()
{
someCode();
}
public void method2(int i, bool b)
{
someCode();
}
}
}
Nested Classes in Python

nested class 2 ประเภทที่นิยมใช้ในภาษาPython
1. Multiple Inner Classes ในภาษาc#ก็สามารถเขียน Multiple inner classได้เช่นกัน
class Employe:
def __init__(self):
self.name = "Employe"
self.intern = self.intern()
self.head = self.head()
def show(self):
print('Employe List')
print('Name:', self.name)
class intern:
def __init__(self):
self.name = 'Smith'
self.Id = '657'
def display(self):
print("Name:", self.name)
print("Id:", self.Id)
class head:
def __init__(self):
self.name = 'Auba'
self.Id = '007'
def display(self):
print("Name:", self.name)
print("Degree:", self.Id)
outer = Employe()
outer.show()
d1 = outer.intern
d2 = outer.head
print()
d1.display()
print()
d2.display()
2. Multilevel inner class ในภาษาc#ก็สามารถเขียน Multilevel inner classได้เช่นกัน
class multi:
def __init__(self):
self.inner = self.Inner()
self.innerinner = self.inner.InnerInner()
def show(self):
print("This is Outer class")
## inner class
class Inner:
def __init__(self):
self.innerinner = self.InnerInner()
def show_classes(self):
print("This is Inner class")
print(self.innerinner)
class InnerInner:
def inner_display(self, msg):
print("InnerInner class")
print(msg)
def inner_display(self, msg):
print("This is Inner class")
print(msg)
outer=multi()
outer.show()
inner = multi.Inner()
innerinner = inner.InnerInner()
innerinner.inner_display("completed")
Video Presentation
Slide
Reference
Overview
วันชัย ขันตี, Programming Concepts, Retrieved 5 October2024, from/http://www.bus.tu.ac.th/usr/wanchai/is311/knowledge/innerclass.pdf
(ใช้ตัวอย่างโค้ด)C# Nested Class, Retrieved 5 October2024, from/https://dev.programiz.com/csharp-programming/nested-class
Nested Type
Nested Types (C# Programming Guide), Retrieved 5 October2024, from/https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/classes-and-structs/nested-types
Access Outer Class Members Inside Inner class
(2024), Java Inner Classes, Retrieved 5 October2024, from/https://www.w3schools.com/java/java_inner_classes.asp
Nested Class in Java
(2023), Nested Classes in Java,Retrieved 5 October2024, from/https://www.geeksforgeeks.org/nested-classes-java/
Java and C# Equivalents, Retrieved 5 October2024, from/https://www.tangiblesoftwaresolutions.com/java-and-csharp-equivalents.html
Nested Class in Python
(2021), Nested Classes in Python Explained with Examples,Retrieved 5 October2024, from/https://www.pythonpool.com/nested-classes-python/
Last updated