ตัวอย่างเช่น 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"); }
}
}
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();
}
}
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());
}
}
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();
}
}
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
}
}