บทที่ 5
การสืบทอด (Inheritance)
วัตถุประสงค์เชิงพฤติกรรม (Behavioral Objectives)
หลังจากศึกษาบทเรียนนี้แล้ว นักศึกษาจะมีความสามารถดังนี้
1.ศึกษาแนวทางการเลือกใช้การสืบทอด
2.อธิบายและยกตัวอย่างการประกอบ (Composition)
3.แสดงตัวอย่างการสืบทอดคุณสมบัติ
4.ยกตัวอย่างการใช้งาน Inheritance
5.จัดบอร์ดเชิงปฏิบัติการ “การสืบทอด Inheritance”
6.สนทนาการปฏิบัติการ”การใช้งาน Inheritance”
7.อธิบายคำศัพท์ได้ 10 คำ
นอกจากความสามารถในการซ่อนหรือปกปิดข้อมูล(Encapsulation) แล้ว “object” ยังมีความสามารถอื่นๆอีก โดยหนึ่งในความสามารถที่โดดเด่นของ “Object” ที่ต้องกล่าวถึง คือการนำกลับมาใช้ใหม่ (Code Recuse) ซึ่งมีได้เคยกล่าวได้แล้วก่อนหน้านี้
โดยปกติจำเป็นต้องใช้คลาสที่มีอยู่แล้วเพื่อนิยามคลาสใหม่ ซึ่งมีวิธีทำได้ 2 วิธี คือ การประกอบและการสืบทอดคุณสมบัติ
ในบทนี้จะกล่าวถึงแนวทางการเลือกใช้ระหว่างการประกอบคลาสและการสืบทอดคลาส รวมทั้งยกตัวอย่างโปรแกรมซึ่งสามารถนำเอาไปทดสอบเพื่อความชำนาญในการเขียนโปรแกรมยิ่งขึ้น
แนวทางการเลือกใช้
ดังที่ได้กล่าวแล้วว่า ผู้เขียนโปรแกรมส่วนมากเข้าใจว่าการสืบทอดคุณสมบัติ (Inheritance) เป็นวิธีการที่สามารถนำคลาสกลับมาใช้งานอีกที่มีประสิทธิภาพมากที่สุด แต่เมื่อได้เขียนโปรแกรมและมีความเข้าใจเพิ่มขึ้น จะเห็นข้อดีข้อเสียการสืบทอดคุณสมบัติ ซึ่งถ้าเขียนโปรแกรมโดยไม่เข้าใจหลักการที่สำคัญก็จะทำให้เกิดข้อผิดพลาดได้ง่าย ซึ่งตรงกันข้ามกับการประกอบ หรือ คอมโพสิตชั่น (Composition) ที่ยืดหยุ่นกว่า นอกจากนี้วิธีการสืบทอดคุณสมบัติจะนำเอาคลาสทั้งหมดมาใช้ โครงสร้างต่างๆ ของคลาสจะถูกถ่ายทอดมาที่วัตถุถูก สำหรับวิธีการคอมโพสิตชั่นจะนำส่วนของคลาสนั้นๆ มาแปะติดกับคลาสใหม่ซึ่งมองในแง่โครงสร้างแล้ว สามารถถอดออกหรือสวมเข้าได้ง่าย อย่างไรก็ดี ผู้ออกแบบโปรแกรมอาจทดสอบ โดยอาศัยความสัมพันธ์ is-a และ has-a ดังนี้
ถ้าใช้ is-a ทดสอบ กล่าวว่า Car is a Engine ถูกต้อง แสดงว่าควรใช้การสืบทอดคุณสมบัติในที่นี้ Car is a Engine ผิด ดังนั้น จึงไม่สามารถใช้การสืบทอดคุณสมบัติได้
ถ้าใช้ has-a ทดสอบ Car has a Engine จะเหมาะสมกว่า ดังนั้น ในกรณีขององค์ประกอบของรถยนต์จึงควรใช้ความสัมพันธ์แบบคอมโพสิตชั่นมากกว่า
จึงอาจสรุปได้ว่าการใช้ is-a ทดสอบแล้วถูกต้องก็จะใช้ความสัมพันธ์แบบสืบทอดคุณสมบัติ แต่ถ้าใช้ has-a ทดสอบแล้วถูกต้องก็จะใช้ความสัมพันธ์แบบคอมโพสิตชั่น
การประกอบ(composition)
การประกอบ (Composition) อาจเรียกว่า การบรรจุ (Comtainment) หรือการสรุป(Aggregation) ของคลาส อ้างถึงการใช้คลาสหนึ่งหรือมากกว่าหนึ่งคลาสในการนิยามคลาสอื่นๆเมื่อสมาชิกข้อมูลของคลาสใหม่เป็นวัตถุของอีกคลาสหนึ่ง กล่าวได้ว่าคลาสใหม่ คือ ส่วนประกอบของวัตถุอื่นๆ
เมื่อพิจารณาโครงสร้างของคลาสรถยนต์ประกอบขึ้นจากคลาส ล้อ ประตู เครื่องยนต์ ส่วนประกอบเหล่านี้สามารถแยกออกโดยที่ไม่กระทบการทำงานของคลาสรถยนต์ได้หรือไม่ ถ้าแยกส่วนประกอบบางส่วนแล้วยังคงทำงานได้ ส่วนประกอบนั้นจะกำหนดให้มีความสัมพันธ์แบบอากิเกชั่น (Aggregation) แต่ในทางตรงกันข้ามถ้าแยกส่วนประกอบส่วนนั้นออกแล้วรถยนต์จะไม่สามารถทำงานได้ ส่วนประกอบนั้นต้องมีความสัมพันธ์กับรถยนต์แบบการประกอบ
รูปที่ 5-1 ความสัมพันธ์แบบประกอบ (Compositon) และ อากิเกชั่น (Aggregation)
ส่วนของล้อและเครื่องยนต์เป็น Composition ส่วนประตูเป็น Aggregation
ตัวอย่างที่ 5-1 คลาส Person
คือ การนิยามคลาสบุคคลอย่างง่าย
ตัวอย่างต่อไปจะนิยามคลาสอีกคลาสหนึ่ง ซึ่งสามารถนำมาประกอบเข้ากับคลาส Person เพื่อปรับปรุงให้ดีขึ้น
ตัวอย่างที่ 5-2 คลาสวันที่
ตอนนี้สามารถใช้คลาส Date ภายในคลาส Person เพื่อเก็บรายละเอียดวันเกิดและวันตายของบุคคลได้
ตัวอย่างที่ 5-3 การประกอบคลาส Date เข้ากับคลาส Person
การสืบทอดคุณสมบัติ
หลักการ “Inheritance” คือการที่ “Class” ใดๆยอมให้การสืบทอด (Inherit) ทั้งคุณสมบัติ (Attributes) และการทำงาน (Method) ไปยัง “Class” อื่น
ตัวอย่างเช่น สมมติว่าเรากำลังพิจารณาในเรื่องสัตว์เลี้ยงลูกด้วยนม (Mammal) โดยได้กำหนดคลาสขึ้นมา 2 คลาส คือ หมา (Dog) กับ แมว (Cat) และแต่ละคลาสเหล่านี้จะมี Attributes สีของตา (Eye Color) ซึ่งถ้ามองในแง่ของโปรแกรมแบบกระบวนความแล้ว จะพบว่าแต่ละ Code ทางตรงข้ามสำหรับการออกแบบเชิงวัตถุแล้ว Attributes นี้แยกออกเป็นของใครของมัน ในทางตรงข้ามสำหรับการออกแบบเชิงวัตถุแล้ว Attributes ของสีตาจะถูกย้ายไปเก็บไว้ที่ Class “สัตว์เลี้ยงลูกด้วยนม” เพียงที่เดียว เนื่องจากว่าเป็นสิ่งที่มีลักษณะที่สามารถใช้ได้ทั้งคลาส “หมา” และ”แมว” ในกรณีเช่นนี้ ทั้งคลาส “หมา"”และ”แมว” จะได้รับการสืบทอดคุณสมบัติมาจากคลาส”สัตว์เลี้ยงลูกด้วยนม”
ดังแสดงในรูป 5-2
ไดอะแกรมในรูปที่ 5-2 ซึ่งแสดงการสืบทอดคุณสมบัติ โดยลูกศรชี้ไปที่คลาสแม่เรียกว่า “Super Class” หรือ “Base Class” ส่วนคลาสที่รับคุณสมบัติเรียกว่า คลาสลูก “Sub Class” หรือ “Derive Class” ลูกศรจะชี้ไปที่คลาสแม่เสมอ
สัญลักษณ์ แสดงความสัมพันธ์ระหว่างคลาส ที่เรียกว่า การสืบทอด”Inheritance”
การใช้งาน Inheritance
การนำสิ่งที่มีอยู่แล้วมาสร้างใหม่โดยอาศัยการถ่ายทอดคุณสมบัติ อาจเรียกว่า การกำหนดคุณลักษณะเฉพาะ (Specialzation) หรือการได้มา (Derivation) สิ่งนี้ปกติมักได้รับการอ้างถึงเสมือนเป็นความสัมพันธ์ “is-a” เพราะว่าวัตถุทุกตัวของคลาสกำลังถูกกำหนดให้ “เป็น” วัตถุของคลาสที่สืบทอดมาด้วย
รูปแบบทั่วไปสำหรับการสร้างคลาส y จากคลาส x คือ
Class Y:public X {
//code
};
ในที่นี้ X ได้รับการเรียกว่า คลาสแม่ (Super Class) และ Y ถูกเรียกว่า คลาสลูก (Sub Class) หรือคลาสย่อย คำหลัก public หลังเครื่องหมาย : ระบุว่าเป็นการถ่ายทอดคุณสมบัติ public ซึ่งหมายถึง สมาชิก public ของคลาสแม่กลายเป็นสมาชิก public ของคลาสลูกด้วย
ตัวอย่างที่ 5-4 สร้างคลาสย่อย Student จากคลาส Person เป็นคลาสแม่
Student เป็นบุคคล ดังนั้น จึงเป็นเรื่องปกติที่ใช้คลาส Person เป็นคลาสแม่
นี่คือโปรแกรมการทดสอบการทำงานสำหรับคลาส Student
ไม่มีความคิดเห็น:
แสดงความคิดเห็น