ตัวอักษรวิ่ง

ยินดีต้อนรับผู้ที่สนใจเว็บ Blogger ของนายกฤษดา ภูมิเพ็ง สื่อการเรียนการสอนออนไลน์โปรแกรมเชิงวัตถุเบื้องต้น

บทเรียนบทที่ 5

 บทที่ 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


ไม่มีความคิดเห็น:

แสดงความคิดเห็น