/ BasicKnowledge

[365 วันแห่งโปรแกรม #day70] Inner Class

วันที่เจ็ดสิบของ ‪#‎365วันแห่งโปรแกรม ห่างหายกันไปนานครับช่วงนี้ผมไม่ว่างเลย วันนี้มาคุยอะไรกันเบาๆ ดีกว่าครับ เอาเรื่อง Inner Class ละกัน


Inner Class

ในเชิงโปรแกรมมิ่งแล้ว Inner Class หมายถึงคลาสที่ถูกประกาศขึ้นในคลาสหรืออินเทอร์เฟซอื่นๆ อีกที เจ้า Inner Class เนี่ยมีอีกชื่อนึงที่เรียกกันบ่อยๆ ก็คือ Nested Class ครับ

แล้วทำไมต้องมี Inner Class ?

Inner class เกิดขึ้นมาเพื่อใช้สำหรับ implement วัตถุอะไรบางอย่างที่มีความสัมพันธ์แนบแน่นกับ Outer Class (คลาสข้างนอก) และวัตถุนั้นไม่จำเป็นต้องแชร์ให้คลาสอื่นๆ ใช้ เช่น เรามีคลาสของรถยนต์คลาสนึงที่จำเป็นต้องใช้ล้อชนิดพิเศษที่ออกแบบมาโดยเฉพาะเท่านั้น และล้อนี้เอาไปใช้ที่ไหนไม่ได้ ดังนั้นเราควรจะ implement ล้อนี้เป็น Inner Class ครับ

เมื่อไหร่ที่ไม่ควรใช้ Inner Class ?

เมื่อสิ่งที่เราต้องการสร้างมันดูเป็น general มาก หรือเป็นคลาสที่ต้องแชร์ให้หลายคน เช่น ล้อสำหรับยานพาหนะอะไรก็ได้ ประมาณนั้น หรือในบางครั้งเราทำ Inner Class แล้ว Inner Class นั้นมีโค้ดปริมาณมหาศาลอยู่ข้างในก็ควรแยกออกมาเป็นคลาสปกติครับ

คุณสมบัติอื่นๆ ของ Inner Class

เนื่องจากตามคอนเซ็ปต์แล้ว Inner Class ก็เป็นแค่คลาสที่อยู่ข้างในคลาสหรืออินเทอร์เฟซอื่น ดังนั้นคุณสมบัติของ Inner Class จึงถูก implement ไว้ต่างกันในแต่ละภาษาโปรแกรม

ใน Java บอกว่า Inner Class มีความสัมพันธ์แบบพิเศษต่อ Outer Class ดังนั้น object ของ Inner Class จะสามารถเรียก member ของ object ของ Outer Class ได้ นั่นหมายความว่าเราไม่สามารถสร้าง object ของ Inner Class ได้โดยไม่สร้าง object ของ Outer Class ก่อน

Java

public class OuterClass {

    public String s;

    class InnerClass {
        public InnerClass() { }
        public String getOuterString() { return s; }
    }

    public String someFunction() {
        InnerClass i = new InnerClass();
        return i.getOuterString();
    }

}

public class Program {

    public static void main(String[] args) {
        OuterClass o = new OuterClass();
        o.s = "TEST";
        System.out.println(o.someFunction());
    }
}

===output===
TEST

ในทางตรงกันข้ามคุณสมบัตินี้ไม่ปรากฏในภาษา C++ และ C# เนื่องจากเป็นภาษาที่มีตัว C ใหญ่เหมือนกัน object ของ Inner Class ไม่สามารถเข้าถึงข้อมูลใดๆ ของ Outer Class ได้เลย เว้นแต่เราจะส่ง object ของ Outer Class เข้าไปให้ object ของ Inner Class ด้วย

C#

class OuterClass {

    public string s;

    public class InnerClass {
        OuterClass o_;
        public InnerClass(OuterClass o) { o_ = o; }
        public string GetOuterString() { return o_.s; }
    }

    public string SomeFunction() {
        InnerClass i = new InnerClass(this);
        return i.GetOuterString();
    }

}

class Program {

    public static void Main(){
        OuterClass o = new OuterClass();
        Console.WriteLine(o.SomeFunction());

        OuterClass.InnerClass i = new OuterClass.InnerClass(o);
        Console.WriteLine(i.GetOuterString());
    }
}

===output===
TEST
TEST

References

Inner Class - Wikipedia

Core Java Inner Class - javabeginnerstutorial

C# nested classes are like C++ nested classes, not Java inner classes - msdn

#‎day70 #365วันแห่งโปรแกรม ‪#‎โครงการ365วันแห่ง‬...