อ่าน 2 นาที
ชั้นใน
ใน การเขียนโปรแกรมเชิงวัตถุ (OOP) คลาสภายใน หรือ คลาสซ้อน คือ คลาส ที่ประกาศไว้ทั้งหมดภายในตัวคลาสหรืออินเทอร์เฟซอื่น ซึ่งแตกต่างจาก คลาสย่อย ที่สืบทอดมาจากคลาสอื่น
ชั้นใน
ในการเขียนโปรแกรมเชิงวัตถุ (OOP) คลาสภายในหรือคลาสซ้อนคือคลาสที่ประกาศไว้ทั้งหมดภายในตัวคลาสหรืออินเทอร์เฟซอื่น ซึ่งแตกต่างจากคลาสย่อยที่สืบทอดมาจากคลาสอื่น
ภาพรวม
อินสแตนซ์ของคลาสปกติหรือคลาสระดับบนสุดสามารถมีอยู่ได้ด้วยตัวเอง ในทางตรงกันข้าม อินสแตนซ์ของคลาสภายในไม่สามารถสร้างขึ้นได้หากไม่ได้ผูกกับคลาสระดับบนสุด
ลองพิจารณาแนวคิดเชิงนามธรรมของยาน พาหนะที่มีส่วนประกอบ Carสี่ส่วน ส่วนประกอบWheelเหล่านี้Wheelมีคุณลักษณะเฉพาะที่ขึ้นอยู่กับการเป็นส่วนหนึ่งของยานพาหนะนั้นCarแนวคิดนี้ไม่ได้แสดงถึงWheelส่วนประกอบWheelในรูปแบบทั่วไปที่อาจเป็นส่วนหนึ่งของยานพาหนะใดๆ แต่แสดงถึงส่วนประกอบที่เฉพาะเจาะจงสำหรับยานพาหนะนั้นๆCarเราสามารถจำลองแนวคิดนี้โดยใช้คลาสภายในได้ดังนี้:
เรามีคลาสระดับบนสุดCarอินสแตนซ์ของคลาสนี้Carประกอบด้วยอินสแตนซ์สี่ตัวของคลาสWheelการใช้งานเฉพาะนี้Wheelเป็นแบบเฉพาะสำหรับรถยนต์ ดังนั้นโค้ดจึงไม่ได้จำลองแนวคิดทั่วไปของล้อซึ่งควรจะแสดงเป็นคลาสระดับบนสุดมากกว่า ด้วยเหตุนี้ มันจึงเชื่อมโยงทางความหมายกับคลาสCarและโค้ดของWheelจึงเชื่อมโยงกับคลาสภายนอกในบางลักษณะ โดยเป็นหน่วยประกอบของรถยนต์ ล้อสำหรับรถยนต์แต่ละคันนั้นมีเอกลักษณ์เฉพาะสำหรับรถคันนั้น แต่เพื่อความเข้าใจโดยทั่วไป ล้อเป็นหน่วยรวมของรถยนต์
คลาสภายในเป็นกลไกที่ช่วยให้เราจำลองความสัมพันธ์นี้ได้อย่างแม่นยำ เราสามารถเรียกWheelคลาสของเราว่า โดยCar.Wheelที่Carเป็นคลาสระดับบนสุด และWheelเป็นคลาสภายใน
คลาสCar { คลาสWheel { double diameter ; }int doors = 4 ; double maxSpeed ; Wheels [] wheels = new Wheels [ 4 ] ; }ดังนั้น คลาสภายในจึงช่วยให้สามารถใช้การเขียนโปรแกรมเชิงวัตถุกับบางส่วนของโปรแกรมได้ ซึ่งหากไม่มีคลาสภายในแล้วส่วนนั้นจะไม่สามารถห่อหุ้มไว้ในคลาสได้
ส่วนของโค้ดที่มีขนาดใหญ่ภายในคลาส อาจจะเหมาะสมกว่าหากจัดโครงสร้างหรือปรับโครงสร้างใหม่เป็นคลาสระดับบนสุดแยกต่างหาก แทนที่จะเป็นคลาสภายใน วิธีนี้จะทำให้โค้ดมีความยืดหยุ่นในการใช้งานมากขึ้นและนำกลับมาใช้ใหม่ได้ง่ายขึ้น แต่ก็อาจเป็นการสรุปแบบเร็วเกินไป วิธีนี้อาจได้ผลดีกว่าหากโค้ดมีคลาสภายในจำนวนมากที่มีฟังก์ชันการทำงานร่วมกัน
ประเภทของคลาสซ้อนกันในภาษา Java
ในภาษา Javaมี คลาสย่อย ซ้อนกัน อยู่ 4 ประเภท :
- สถิต
- คลาสสมาชิกแบบคงที่ หรือเรียกอีกอย่างว่าคลาสซ้อนแบบคงที่[ 1 ] – คลาสเหล่านี้ถูกประกาศไว้
staticเช่นเดียวกับสิ่งอื่นๆ ในขอบเขตคงที่ (เช่นเมธอดคงที่ ) คลาสเหล่านี้ไม่มีอินสแตนซ์ที่ครอบคลุม และไม่สามารถเข้าถึงตัวแปรอินสแตนซ์และเมธอดของคลาสที่ครอบคลุมได้ คลาสเหล่านี้เกือบจะเหมือนกับคลาสที่ไม่ซ้อนกัน ยกเว้นรายละเอียดขอบเขต (คลาสเหล่านี้สามารถอ้างอิงถึงตัวแปรและเมธอดคงที่ของคลาสที่ครอบคลุมได้โดยไม่ต้องระบุชื่อคลาสที่ครอบคลุม คลาสอื่นๆ ที่ไม่ใช่หนึ่งในคลาสที่ครอบคลุมจะต้องระบุชื่อคลาสที่ครอบคลุมด้วยชื่อของคลาสที่ครอบคลุม) อินเทอร์เฟซ แบบซ้อนกัน เป็นแบบคงที่โดยปริยาย
- คลาสที่ไม่ใช่แบบคงที่ / คลาสภายใน
คลาสภายใน – หมวดหมู่ต่อไปนี้เรียกว่าคลาสภายในแต่ละอินสแตนซ์ของคลาสเหล่านี้จะมีการอ้างอิงถึงอินสแตนซ์ที่ครอบคลุม (เช่น อินสแตนซ์ของคลาสที่ครอบคลุม) ยกเว้นคลาสโลคอลและคลาสนิรนามที่ประกาศในบริบทคงที่ ดังนั้นจึงสามารถอ้างอิงถึงตัวแปรอินสแตนซ์และเมธอดของคลาสที่ครอบคลุมได้โดยปริยาย การอ้างอิงอินสแตนซ์ที่ครอบคลุมสามารถรับได้โดยชัดแจ้งผ่านทางEnclosingClassName.thisคลาสภายในอาจไม่มีตัวแปรหรือเมธอดแบบคงที่ ยกเว้นตัวแปรคงที่ในเวลาคอมไพล์ เมื่อสร้างขึ้น คลาสเหล่านี้จะต้องมีการอ้างอิงถึงอินสแตนซ์ของคลาสที่ครอบคลุม ซึ่งหมายความว่าต้องสร้างขึ้นภายในเมธอดอินสแตนซ์หรือคอนสตรัคเตอร์ของคลาสที่ครอบคลุม หรือ (สำหรับคลาสสมาชิกและคลาสนิรนาม) สร้างขึ้นโดยใช้enclosingInstance.new InnerClass()ไวยากรณ์[ 1 ]
- คลาสสมาชิก – คลาสเหล่านี้ถูกประกาศไว้นอกฟังก์ชัน (จึงเรียกว่า "สมาชิก") และไม่ได้ถูกประกาศ
staticโดยตรง - คลาสภายใน (Local class) – คือคลาสที่ประกาศไว้ภายในตัวฟังก์ชัน สามารถอ้างอิงถึงได้เฉพาะในส่วนที่เหลือของฟังก์ชันเท่านั้น คลาสเหล่านี้สามารถใช้ตัวแปรและพารามิเตอร์ภายในฟังก์ชันได้ แต่เฉพาะตัวแปรที่ประกาศไว้ภายในฟังก์ชันเท่านั้น
final(เนื่องจากอินสแตนซ์ของคลาสภายในต้องเก็บสำเนาของตัวแปรแยกต่างหาก เพราะตัวแปรอาจมีอายุยืนยาวกว่าฟังก์ชัน เพื่อป้องกันความสับสนของตัวแปรที่แก้ไขได้สองตัวที่มีชื่อเดียวกันในขอบเขตเดียวกัน จึงบังคับให้ตัวแปรนั้นไม่สามารถแก้ไขได้) คลาสภายในมีประโยชน์มากสำหรับการสร้างคลาสที่มีฟิลด์ประเภททั่วไป (generic type fields) โดยที่ตัวแปรประเภทถูกกำหนดไว้ในเมธอด - คลาสที่ไม่ระบุชื่อ – คลาสเหล่านี้เป็นคลาสภายในที่ถูกประกาศและสร้างอินสแตนซ์โดยอัตโนมัติในระหว่างนิพจน์ พวกมันสามารถสืบทอดโดยตรงจากคลาสหนึ่งหรือใช้งานอินเทอร์เฟซหนึ่งเท่านั้น พวกมันสามารถระบุอาร์กิวเมนต์ให้กับคอนสตรัคเตอร์ของคลาสแม่ได้ แต่ไม่สามารถมีคอนสตรัคเตอร์อื่นได้ (อย่างไรก็ตาม นี่ไม่ใช่ข้อจำกัด เนื่องจากพวกมันสามารถมีบล็อกตัวเริ่มต้นอินสแตนซ์เพื่อทำการเริ่มต้นใดๆ ก็ได้)
ภาษาโปรแกรม
- คลาสภายใน (Inner classes) เริ่มเป็นคุณสมบัติหนึ่งของภาษาการเขียนโปรแกรม Javaตั้งแต่เวอร์ชัน 1.1 เป็นต้นไป
- คลาสซ้อนกันยังเป็นคุณลักษณะของภาษาโปรแกรม D , Visual Basic .NET , Ruby , C++และC# อีก ด้วย
- ในภาษา Pythonนั้น สามารถสร้างคลาสซ้อนคลาส เมธอด หรือฟังก์ชันได้
- C++มีคลาสซ้อนกันซึ่งคล้ายกับคลาสสมาชิกแบบ static ในภาษา Java เพียงแต่ว่าไม่ได้ประกาศด้วยคำว่า "static"
- ภาษา BETAเป็นผู้ริเริ่มแนวคิดเรื่องคลาสซ้อนกันนี้
- ในภาษา Cการประกาศโครงสร้างแบบ ไม่ระบุชื่อ ภายในโครงสร้างอื่นนั้นถูกต้องตามกฎหมาย แต่ไม่สามารถตั้งชื่อได้ เนื่องจากไม่มีแนวคิดเรื่องประเภทซ้อนกัน (ต่างจากภาษา C++ ที่การซ้อนโครงสร้างที่มีชื่อนั้นถูกต้องตามกฎหมาย)
โค้ด GUI
ในภาษา Java มักใช้คลาสภายในแบบโลคอล (Local inner classes) เพื่อกำหนดฟังก์ชันเรียกกลับ (callback) สำหรับโค้ด GUI จากนั้นคอมโพเนนต์ต่างๆ สามารถใช้ร่วมกันอ็อบเจ็กต์ที่ใช้งานอินเทอร์เฟซการจัดการเหตุการณ์ หรือขยายคลาสอะแดปเตอร์นามธรรม (abstract adapter class) ซึ่งประกอบด้วยโค้ดที่จะถูกเรียกใช้เมื่อเกิดเหตุการณ์ที่กำหนด
คลาสภายในที่ไม่ระบุชื่อยังถูกนำมาใช้ในกรณีที่โค้ดการจัดการเหตุการณ์ถูกใช้โดยคอมโพเนนต์เพียงตัวเดียวเท่านั้น ดังนั้นจึงไม่จำเป็นต้องมีการอ้างอิงแบบระบุชื่อ
วิธีนี้ช่วยหลีกเลี่ยงวิธีการขนาดใหญ่ที่ซับซ้อนactionPerformed(ActionEvent)ซึ่งมีเงื่อนไข if-else หลายชั้นเพื่อระบุแหล่งที่มาของเหตุการณ์ โค้ดประเภทนี้มักถูกมองว่ายุ่งเหยิง และการใช้คลาสภายในนั้นถือว่าดีกว่าในทุกด้าน
ลิงก์ภายนอก
- " คลาสเรียนภายในแล้วคลาสเรียนภายในมีประโยชน์อะไรกันแน่?"
- คลาสซ้อนในภาษา D
สรุปเนื้อหา
ข้อมูลสำคัญจากบทความ
ข้อมูลสำคัญเกี่ยวกับ ชั้นใน
ใน การเขียนโปรแกรมเชิงวัตถุ (OOP) คลาสภายใน หรือ คลาสซ้อน คือ คลาส ที่ประกาศไว้ทั้งหมดภายในตัวคลาสหรืออินเทอร์เฟซอื่น ซึ่งแตกต่างจาก คลาสย่อย ที่สืบทอดมาจากคลาสอื่น
ภาพรวม
อินสแตนซ์ของคลาสปกติหรือคลาสระดับบนสุดสามารถมีอยู่ได้ด้วยตัวเอง ในทางตรงกันข้าม อินสแตนซ์ของคลาสภายในไม่สามารถสร้างขึ้นได้หากไม่ได้ผูกกับคลาสระดับบนสุด
ประเภทของคลาสซ้อนกันในภาษา Java
ใน ภาษา Java มี คลาสย่อย ซ้อนกัน อยู่ 4 ประเภท :
ภาษาโปรแกรม
คลาสภายใน (Inner classes) เริ่มเป็นคุณสมบัติหนึ่งของ ภาษาการเขียนโปรแกรม Java ตั้งแต่เวอร์ชัน 1.1 เป็นต้นไป คลาสซ้อนกันยังเป็นคุณลักษณะของ ภาษาโปรแกรม D , Visual Basic .