ความหลากหลายกับการสืบทอด: ความแตกต่างระหว่างความหลากหลายและการสืบทอด [2022]
เผยแพร่แล้ว: 2021-01-05ความแตกต่างและการสืบทอดเป็นทั้งแนวคิดพื้นฐานของการเขียนโปรแกรมเชิงวัตถุ การเพิ่มอ็อบเจ็กต์ในภาษาการเขียนโปรแกรมสมัยใหม่ทำให้เกิดความแตกต่างอย่างมากในวิธีที่เราใช้ภาษาและสิ่งที่เราสามารถทำได้กับพวกมัน โดยสังเขป การเขียนโปรแกรมเชิงวัตถุเป็นชุดของวิธีการที่อนุญาตให้โปรแกรมเมอร์ใช้คลาส และด้วยเหตุนี้ ได้มาซึ่งวัตถุตามคลาสเหล่านี้
มีจุดมุ่งหมายเพื่อให้คล้ายกับหน่วยงานในโลกแห่งความเป็นจริงและทำให้โปรแกรมเมอร์สร้างโค้ดที่รวมกระบวนทัศน์ที่พวกเขากำลังเขียนโค้ดได้ง่ายขึ้น มีแนวคิดการเขียนโปรแกรมเชิงวัตถุสี่แนวคิด ได้แก่ Inheritance, Abstraction, Polymorphism และ encapsulation ในตอนนี้ แนวคิดแต่ละข้อดังที่กล่าวไว้ก่อนหน้านี้ ถือได้ว่าเป็นเสาหลักที่ภาษาสมัยใหม่ใดๆ มีอยู่ในปัจจุบัน
กลับมาที่หัวข้อ polymorphism กับ inheritance และ right of the bat ของเรา เราจะเห็นความแตกต่างที่เห็นได้ชัดระหว่างแนวคิดทั้งสอง การสืบทอดเป็นแนวคิดที่อนุญาตให้ใช้รหัสซ้ำอีกครั้งในโปรแกรมเดิมหรือโปรแกรมอื่น เรายังเปลี่ยนวิธีการทำงานของโค้ดได้ด้วยการรักษาสิ่งที่เราชอบและละทิ้งสิ่งที่ไม่เป็นประโยชน์สำหรับงานที่เราพยายามทำให้สำเร็จ การสืบทอดช่วยประหยัดเวลาได้มากในการพัฒนาเกือบทุกอย่างที่เราเห็นบนจอแสดงผลดิจิทัลของเราในปัจจุบัน
ในอีกทางหนึ่ง ความหลากหลายมีหน้าที่กำหนดโค้ดที่เขียนไว้แล้วและตัดสินใจว่าโค้ดประเภทใดที่ต้องดำเนินการตามพารามิเตอร์เฉพาะในแบบเรียลไทม์ มันจะเป็นประโยชน์สำหรับทุกคนที่จะอ่านแนวคิดแต่ละข้ออย่างละเอียดก่อน ก่อนย้ายไปอภิปรายความแตกต่างระหว่างความหลากหลายและการสืบทอด ความแตกต่างจะเด่นชัดมากขึ้นเมื่อเรารู้ความหมายของการสืบทอดและความหลากหลายทางชีวภาพ
รับ ปริญญาวิศวกรรมซอฟต์แวร์ จากมหาวิทยาลัยชั้นนำของโลก รับโปรแกรม PG สำหรับผู้บริหาร โปรแกรมประกาศนียบัตรขั้นสูง หรือโปรแกรมปริญญาโท เพื่อติดตามอาชีพของคุณอย่างรวดเร็ว
สารบัญ
มรดก
มันจะเป็นอาชญากรรมในกระบวนทัศน์การเขียนโปรแกรมหากไม่ถือว่าการสืบทอดเป็นแนวคิด OOP ที่มีความสำคัญมาก ความสำคัญของมรดกไม่ควรได้รับการปฏิบัติเพียงเล็กน้อยเพราะจุดมุ่งหมายของการสืบทอดคือ "การนำกลับมาใช้ใหม่" การสืบทอดทำอะไร ตามที่ชื่อบอกเป็นนัย คือการอนุญาตให้โค้ดที่เขียนในคลาสสามารถขยายไปยังคลาสอื่นได้ ดังนั้นในการสืบทอดจึงมีคลาสฐานอยู่ คลาสที่เขียนโค้ดจะถูกใช้ซ้ำ

คลาสต่อไปที่เราจะสร้างจะต้องได้รับการสืบทอดจากคลาสพื้นฐานนี้เพื่อใช้ฟังก์ชันและตัวแปรทั้งหมดที่เกี่ยวข้องกับคลาสฐาน เมื่อใดก็ตามที่คลาสใช้คุณสมบัติของคลาสอื่น (หรือสืบทอดจากคลาสอื่น) สมาชิกทั้งหมดที่อยู่ในคลาสฐานจะกลายเป็นสมาชิกของคลาสที่ได้รับใหม่นี้
โค้ดตัวอย่างด้านล่างจะแสดงให้คุณเห็นว่าการสืบทอดรูปแบบทั่วไปเป็นอย่างไร สิ่งสำคัญประการหนึ่งที่ควรทราบในที่นี้คือ ไวยากรณ์ที่แน่นอนที่คุณจะต้องเขียนเพื่อเปิดใช้งานการสืบทอดโค้ดของคุณ จะขึ้นอยู่กับภาษาการเขียนโปรแกรมที่คุณเลือกเท่านั้น
- ชื่อคลาสที่ได้รับ: access-specifier base-class-name{
- // เนื้อหาของคลาสที่ได้รับ
- }
ในตัวอย่างที่แสดงด้านบน บางสิ่งจำเป็นต้องมีคำอธิบายเล็กน้อย คำว่า "ตัวระบุการเข้าถึง" หมายถึงวิธีที่คลาสที่ได้รับจะเข้าถึงคุณสมบัติและวิธีการของคลาสฐาน โดยทั่วไปมีตัวระบุการเข้าถึงสามตัว ซึ่งแต่ละตัวมีความหมายของตัวเอง (ได้แก่ ส่วนตัว สาธารณะ และการป้องกัน) และคุณสมบัติ
อีกครั้ง ขึ้นอยู่กับภาษาที่คุณเลือก คุณอาจต้องใช้หรือไม่จำเป็นต้องใช้ตัวระบุการเข้าถึงเหล่านี้ ดังนั้น ในโลกของ C++ หากคุณสืบทอดโดยไม่ระบุสิ่งใดโดยค่าเริ่มต้น สิ่งนั้นจะเป็นแบบส่วนตัว อย่างไรก็ตาม หากคุณสืบทอดจากโครงสร้าง (ไปตามโครงสร้างคำหลัก) ตัวระบุการเข้าถึงเริ่มต้นจะเป็นแบบสาธารณะแทนที่จะเป็นแบบส่วนตัว
อ่าน: โอกาสในการทำงานในภาษาการเขียนโปรแกรม R
C ++ ยังให้คุณมีตัวเลือกมากมายเมื่อคุณทำการสืบทอด คุณจะพบรายการด้านล่าง:
ก. การ สืบทอดตามลำดับชั้น: การสืบทอด ประเภทนี้เป็นไปตามกฎที่ควรมีเพียงหนึ่ง superclass และจาก superclass นั้นจะต้องมี subclass ที่ได้รับจำนวนมาก คุณจะพบตัวอย่างด้านล่าง:
- //คลาสพื้นฐาน
- คลาส A
- {
- โมฆะสาธารณะ funA()
- {
- //
- }
- }
- //คลาสที่ได้รับ
- คลาส B: A
- {
- โมฆะสาธารณะ funB()
- {
- //
- }
- }
- //คลาสที่ได้รับ
- คลาส C: A
- {
- โมฆะสาธารณะ funC()
- {
- //
- }
- }
- //คลาสที่ได้รับ
- คลาส D: C
- {
- โมฆะสาธารณะ funD()
- {
- //
- }
- }
- //คลาสที่ได้รับ
- คลาส E: C
- {
- โมฆะสาธารณะ funE()
- {
- //
- }
- }
- //คลาสที่ได้รับ
- คลาส F: B
- {
- โมฆะสาธารณะ funF()
- {
- //
- }
- }
- //คลาสที่ได้รับ
- คลาส G: B
- {
- โมฆะสาธารณะ funG()
- {
- //
- }
- }
ข. การสืบทอดหลายรายการ: หากคุณกำลังทำการสืบทอดหลายรายการ นั่นหมายความว่าคุณมีคลาสย่อยที่ได้รับเพียงหนึ่งคลาสซึ่งสืบทอดมาจากซูเปอร์คลาสหลายตัว คุณจะพบตัวอย่างง่ายๆ ของการสืบทอดหลายรายการด้านล่าง:
- //คลาสพื้นฐาน
- คลาส A
- {
- โมฆะสาธารณะ funA()
- {
- //
- }
- }
- //คลาสพื้นฐาน
- คลาส B
- {
- โมฆะสาธารณะ funB()
- {
- //
- }
- }
- //คลาสที่ได้รับ
- คลาส C: A, B
- {
- โมฆะสาธารณะ funC()
- {
- //
- }
- }
ค. มรดกเดี่ยว: นี่อาจเป็นรูปแบบการสืบทอดที่ง่ายที่สุด มีเพียงหนึ่งคลาสฐานและหนึ่งคลาสที่ได้รับ คุณจะพบตัวอย่างด้านล่าง:
- //คลาสพื้นฐาน
- คลาส A
- {
- โมฆะสาธารณะ funA()
- {
- //ทำ:
- }
- }
- //คลาสที่ได้รับ
- คลาส B: A
- {
- โมฆะสาธารณะ funB()
- {
- //ทำ:
- }
- }
ความหลากหลาย
คำจำกัดความพื้นฐานของคำว่า polymorphism หมายถึง มีหลายรูปแบบ คำจำกัดความนี้มีความแม่นยำมากในการอธิบายความหลากหลายในบริบทของการเขียนโปรแกรม ในกระบวนทัศน์นี้ ความหลากหลายใช้ความหมายของฟังก์ชันเดียวแต่มีหลายรูปแบบ Polymorphism เกิดขึ้นจริงในเวลารวบรวม ความหลากหลาย ณ เวลาคอมไพล์เป็นไปได้เพียงเพราะแนวคิดของการโอเวอร์โหลด และ ณ รันไทม์ คุณลักษณะของการแทนที่ทำให้พหุสัณฐานเป็นจริง ทีละอย่าง ให้เราจัดการกับคำจำกัดความของทั้งการโอเวอร์โหลดและการเอาชนะ

การโอเวอร์โหลดต้องการให้โค้ดที่คุณเขียนหรือฟังก์ชันของคลาสถูกเขียนมากกว่าหนึ่งครั้งด้วยพารามิเตอร์ที่ต่างกัน แต่มีประเภทการส่งคืนเหมือนกัน หมายความว่าอาร์กิวเมนต์ที่คุณส่งผ่านไปยังฟังก์ชันสามารถแตกต่างกันได้ และเพียงแค่ดูค่าสุดท้ายที่ส่งผ่านไปยังฟังก์ชัน ณ รันไทม์ รูปแบบของฟังก์ชันที่จะเรียกใช้ก็ตัดสินได้ โดยทั่วไป เราจะเห็นว่า class constructor เป็นฟังก์ชันที่โอเวอร์โหลดมากที่สุด ทฤษฎีทั้งหมดนี้จะชัดเจนขึ้น และจะง่ายขึ้นสำหรับคุณที่จะจดจำมันไว้ในใจด้วยความช่วยเหลือจากตัวอย่าง
- คลาสเกิน{
- int a, b;
- สาธารณะ:
- int โอเวอร์โหลด (int x) { // โอเวอร์โหลดแรก () ตัวสร้าง
- ก=x;
- ส่งคืน a;
- }
- int โอเวอร์โหลด (int x, int y) { //วินาทีโอเวอร์โหลด () ตัวสร้าง
- ก=x;
- b=y;
- ส่งคืน a*b;
- }
- };
- int หลัก (){
- โอเวอร์โหลด O1;
- โอ1 เกินพิกัด (20); // โอเวอร์โหลดแรก () คอนสตรัคเตอร์เรียก
- โอ1 เกินพิกัด (20,40); // โอเวอร์โหลดที่สอง () การเรียกคอนสตรัคเตอร์
ในตัวอย่างนี้ เราเห็นการใช้งานเกินกำลัง ดูว่าคอนสตรัคเตอร์ต่างกันอย่างไรขึ้นอยู่กับว่าค่าสุดท้ายของวงเล็บของอ็อบเจ็กต์เป็นจำนวนเต็มหนึ่งหรือสอง
ให้เราจัดการกับคำจำกัดความของการเอาชนะต่อไป คุณสามารถดำเนินการแทนที่ได้เฉพาะฟังก์ชันที่สืบทอดมาเท่านั้น ใช่ การสืบทอดเป็นจุดสำคัญในการทำให้การแทนที่ฟังก์ชันเป็นไปได้ หากคุณต้องการเขียนฟังก์ชันและแทนที่ด้วย ใน C++ คุณจะต้องใช้คีย์เวิร์ด virtual ก่อนกำหนดฟังก์ชัน และในคลาสที่ได้รับโดยใช้ชื่อเดียวกันสำหรับฟังก์ชันของคุณ ให้ลบคีย์เวิร์ดเสมือนออก เพื่อเสริมสร้างความเข้าใจของคุณ นี่คือตัวอย่าง:
- ฐานชั้น{
- สาธารณะ:
- ฟังก์ชัน โมฆะเสมือน ( ) {// ฟังก์ชันเสมือนของคลาสฐาน
- cout<<"นี่คือ funct() ของคลาสพื้นฐาน";
- }
- };
- คลาสที่ได้รับ1 : ฐานสาธารณะ{
- สาธารณะ:
- void funct () {// ฟังก์ชั่นเสมือนของคลาสฐานกำหนดใหม่ในคลาสที่ได้รับ1
- cout<<"นี่คือ function() ของคลาสที่รับมา";
- }
- };
- int หลัก ()
- {
- ฐาน *p, b;
- ที่ได้รับ1 d1;
- *p=&b;
- p-> ฟังก์ชั่ น (); // เรียกใช้ฟังก์ชันคลาสพื้นฐาน ()
- *p=&d1;
- กลับ 0;
- }
ดูว่าคีย์เวิร์ด virtual ถูกใช้อย่างไรในคลาสฐาน และในคลาสที่ได้รับ นิยามฟังก์ชันเดียวกันก็คือไม่มีคีย์เวิร์ด virtual
ความแตกต่างบางประการระหว่างความแตกต่างและการสืบทอด:
- การสืบทอดคือการสร้างคลาส จากนั้นให้คลาสอื่นๆ ในโปรแกรมของคุณรับฟีเจอร์จากคลาสพื้นฐานที่มีอยู่แล้ว อย่างไรก็ตาม พหุสัณฐานเป็นส่วนต่อประสาน และเนื่องจากเป็นอินเทอร์เฟซ จึงสามารถใช้รูปร่างและรูปแบบที่แตกต่างกันได้
- การสืบทอดเป็นคุณสมบัติที่เกี่ยวข้องกับคลาสเพียงอย่างเดียว ในขณะที่พหุสัณฐานขยายตัวเองเป็นวิธีการและ/หรือฟังก์ชันใดๆ
- การสืบทอดอนุญาตให้คลาสที่ได้รับใช้ฟังก์ชันและตัวแปรทั้งหมดที่ประกาศในคลาสฐานโดยไม่ต้องกำหนดอย่างชัดเจนอีก นั่นคือเหตุผลที่เรากล่าวว่าการสืบทอดเพิ่มความสามารถในการนำรหัสกลับมาใช้ใหม่ได้และลดความยาวของรหัส ซึ่งเราจะต้องเขียนหากไม่มีการสืบทอด ในขณะที่พหุสัณฐานทำให้ชื่อฟังก์ชันเดียวกันมีรหัสที่แตกต่างกันสองรหัส ดังนั้น ในแง่หนึ่ง แทนที่จะลดความยาวของโค้ดที่เราจะต้องเขียน ความหลากหลายกลับขยายออกไปอีก
- มีหลายรูปแบบที่สามารถรับมรดกได้ คุณสามารถสร้างสรรค์ได้อย่างแท้จริงด้วยการสืบทอด อย่างไรก็ตาม ความหลากหลายสามารถทำได้ด้วยสองวิธีเท่านั้น คือ การโอเวอร์โหลดและการเอาชนะ คุณยังสามารถคลั่งไคล้ได้มากในขณะที่ใช้ polymorphism แต่คุณถูกจำกัดให้ใช้งานได้เพียงสองวิธีในการเขียนโค้ดของคุณ
ต้องอ่าน: ต้องอ่าน 47 OOPS คำถามและคำตอบสัมภาษณ์สำหรับ Freshers & ผู้มีประสบการณ์
ความหลากหลายกับการสืบทอด: ความแตกต่างแบบตาราง
ในตารางด้านล่าง คุณจะพบความแตกต่างที่ชัดเจนระหว่างความแตกต่างและการสืบทอด:

มาตรการเปรียบเทียบ | มรดก | โพลิมอร์ฟิซึม |
ความแตกต่างพื้นฐานระหว่างทั้งสอง | ความหมายของการสืบทอดคือการสร้างคลาสใหม่ที่มีคุณสมบัติ (ฟังก์ชั่นและตัวแปรของคลาสที่มีอยู่) | โดยพื้นฐานแล้วเป็นแพลตฟอร์มที่อนุญาตให้เขียนโค้ดในรูปแบบต่างๆ |
ความแตกต่างในการรวมทั้งสองอย่างเข้ากับโค้ดของคุณ | เฉพาะชั้นเรียนเท่านั้นที่สามารถเพลิดเพลินกับมรดกที่แท้จริงในรหัส | สามารถใช้งานได้และใช้งานโดยฟังก์ชันและ/หรือวิธีการใดๆ ตลอดทั้งโค้ด |
ความแตกต่างในการใช้งานทั้งสองแบบ | ช่วยให้โค้ดที่เขียนขึ้นเพื่อใช้ซ้ำภายในโปรแกรมเดียวกันหรือต่างกัน หากไม่มีสิ่งนี้ การเขียนโปรแกรมเชิงวัตถุจะขาดคุณสมบัติที่สำคัญ | อนุญาตให้อ็อบเจ็กต์ที่ประกาศไว้ตัดสินใจได้ว่าจะใช้รูปแบบใดของฟังก์ชัน มีสองครั้งที่สามารถตัดสินใจได้ ที่รันไทม์จะเรียกว่าการแทนที่ เวลาคอมไพล์จะเรียกว่าโอเวอร์โหลด |
ต่างรูปแบบกันไปคนละแบบ | มีรูปแบบมากมายที่สามารถรับมรดกได้ | ความหลากหลายสามารถมีได้เพียงสองรูปแบบเท่านั้น ขึ้นอยู่กับเวลาในโปรแกรม จะเปลี่ยนจากการโอเวอร์โหลดเป็นการแทนที่ |
ตัวอย่างพื้นฐานที่แสดงให้เห็นว่าแต่ละข้อมีการใช้งานอย่างไร | คลาสไบค์สามารถสืบทอดมาจากคลาสของยานพาหนะสองล้อ ซึ่งอาจกลายเป็นคลาสย่อยของยานพาหนะ | คลาสไบค์สามารถมีเมธอดชื่อ set_color() ซึ่งจะเปลี่ยนสีของจักรยานตามชื่อสีที่คุณป้อน |
เช็คเอาท์: Type Casting ใน Java คืออะไร | ทำความเข้าใจการหล่อแบบเป็นมือใหม่
บทสรุป
มันปลอดภัยที่จะบอกว่าทั้งความหลากหลายและการสืบทอดเป็นแนวคิดที่สำคัญในการทำให้โปรแกรมใดๆ เป็นจริง ทั้งคู่เป็นพื้นฐานในการวางแนวคิดของการเขียนโปรแกรมเชิงวัตถุ ความแตกต่างระหว่างความหลากหลายและการสืบทอดนั้นมีความแตกต่างกันมาก เนื่องจากสิ่งเหล่านี้มีจุดประสงค์สองประการที่แตกต่างกันมาก
ความหลากหลายช่วยให้โปรแกรมเมอร์เขียนคำจำกัดความของฟังก์ชันได้หลายแบบ ในขณะเดียวกัน การสืบทอดทำให้ผู้ใช้สามารถนำโค้ดที่เขียนไปแล้วมาใช้ซ้ำได้ เพื่อให้เข้าใจและชื่นชมแนวคิดทั้งสองอย่างถ่องแท้ ขอแนะนำให้อ่านเพิ่มเติมในทั้งสองหัวข้อ
สิ่งหนึ่งที่คุณควรจำไว้เสมอทุกครั้งที่คุณเขียนโค้ดคือ ถ้าคุณต้องการปรับโครงสร้างโค้ดที่คุณได้เขียนไปแล้ว (โดยทั่วไปคือนิยามของคลาสหนึ่งและใช้อีกครั้งในโค้ดของคุณเพื่อให้บริการที่เหมือนหรือแตกต่าง วัตถุประสงค์) ท่านควรใช้มรดก หากคุณต้องการลดความสับสนโดยรวมในโค้ดของคุณและต้องการใช้ชื่อเดียวกันของฟังก์ชันเพื่อทำงานที่คล้ายกัน คุณควรใช้ polymorphism
หากคุณสนใจที่จะเรียนรู้เพิ่มเติมเกี่ยวกับการพัฒนาซอฟต์แวร์แบบฟูลสแตก โปรดดูประกาศนียบัตร PG ของ upGrad & IIIT-B ด้านการพัฒนาซอฟต์แวร์แบบครบวงจร ซึ่งออกแบบมาสำหรับมืออาชีพที่ทำงานและมีการฝึกอบรมที่เข้มงวดมากกว่า 500 ชั่วโมง โครงการมากกว่า 9 โครงการ และ การมอบหมายงาน สถานะศิษย์เก่า IIIT-B โครงการหลักที่นำไปปฏิบัติจริง และความช่วยเหลือด้านงานกับบริษัทชั้นนำ
