Skip to main content

วิธีการเอาชนะคืออะไร?

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

ตัวอย่างเช่นคลาส A อาจมีวิธีที่เรียกว่า Dosomething และวิธีนี้จะไม่ใช้พารามิเตอร์อินพุตนอกจากนี้คลาส B และ C อาจเป็นคลาสย่อยของคลาส A. คลาส B อาจมีวิธีการที่เรียกว่า Dosomething ซึ่งไม่มีพารามิเตอร์อินพุตและคลาส C อาจมีวิธีการบางอย่างที่ใช้ตัวเลขเป็นพารามิเตอร์อินพุตในตัวอย่างนี้มีเพียงคลาส B เท่านั้นที่แสดงให้เห็นถึงวิธีการเอาชนะเนื่องจากวิธีการ Dosomething ของมันมีลายเซ็นวิธีการเดียวกันกับ superclass ของมันคลาส A วิธีการ Dosomething ในคลาส C ในทางกลับกันแสดงวิธีการมากเกินไปเพราะมันสร้างวิธีการใหม่อย่างสมบูรณ์อย่างสมบูรณ์อย่างสมบูรณ์อย่างสมบูรณ์.

มรดกเสมือนจริงใน C ++ เป็นอีกตัวอย่างหนึ่งของวิธีการเอาชนะวิธีการเสมือนจริงใน superclasses อาจหรืออาจไม่ได้ใช้งาน แต่คำจำกัดความย่อยใด ๆ ของพวกเขาเป็นอินสแตนซ์ของวิธีการเอาชนะเมื่อวิธีการถูกแทนที่ในคลาสย่อยวิธีการของ superclass จะไม่ถูกเรียกเว้นแต่ว่าจะถูกเรียกอย่างชัดเจนวิธีการเฉพาะนี้ในการเรียกใช้วิธีการแทนที่มักจะกล่าวถึงการซ่อนการใช้งาน superclass

ถึงแม้ว่าวิธีการเอาชนะมีความยืดหยุ่นมาก แต่วิธีการทั้งหมดไม่สามารถแทนที่ได้และมีบางครั้งที่ความแข็งแกร่งนี้อาจจะดีกว่าในทั้ง Java และ C ++ สามารถใช้คำหลักเฉพาะในลายเซ็นวิธีเพื่อป้องกันไม่ให้วิธีการถูกแทนที่ในคลาสย่อยในการทำเช่นนี้ Java ใช้คำหลักสุดท้ายและ C ++ ใช้คำหลัก constการป้องกันวิธีการเอาชนะจะเป็นประโยชน์หากฟังก์ชั่นเฉพาะควรไม่เปลี่ยนแปลงตลอดต้นไม้มรดก

โดยทั่วไปวิธีการง่าย ๆ ที่ได้รับข้อมูลชิ้นเล็ก ๆ ไม่ควรถูกแทนที่กรณีที่มีแนวโน้มที่จะได้รับประโยชน์มากที่สุดจากการเอาชนะคือเมื่อคลาสย่อยมีจุดมุ่งหมายเพื่อเพิ่มฟังก์ชันการทำงานให้กับวิธี superclass โดยไม่ต้องสร้างวิธีการใหม่ทั้งหมดเพื่อทำเช่นนั้นกรณีที่ผิดปกติซึ่งวิธีการที่จะต้องทำใหม่อย่างสมบูรณ์สำหรับวัตถุประเภทหนึ่งอาจได้รับประโยชน์จากเทคนิคนี้เมื่อใดก็ตามที่วิธีการถูกแทนที่เป็นสิ่งสำคัญสำหรับโปรแกรมเมอร์ที่จะต้องแสดงความคิดเห็นอย่างเพียงพอทั้งวิธี superclass และ subclassตามหลักการแล้วความคิดเห็นเหล่านี้ควรชี้แจงว่าแต่ละตัวแปรของวิธีการทำอย่างไรรวมถึงวิธีและเหตุผลที่พวกเขาแตกต่างกัน