ในมุมมองภาษาการเขียนโปรแกรมการพิมพ์ย่อยหมายถึงอะไร ฉันได้ยินมาว่า "มรดกไม่ใช่การพิมพ์ย่อย" แล้วความแตกต่างระหว่างการสืบทอดและการพิมพ์ย่อยคืออะไร
ในมุมมองภาษาการเขียนโปรแกรมการพิมพ์ย่อยหมายถึงอะไร ฉันได้ยินมาว่า "มรดกไม่ใช่การพิมพ์ย่อย" แล้วความแตกต่างระหว่างการสืบทอดและการพิมพ์ย่อยคืออะไร
คำตอบ:
[ฉันไม่ได้คิดอย่างลึกซึ้งเกี่ยวกับปัญหาของระบบพิมพ์เชิงวัตถุ แต่ฉันจะพูดในสิ่งที่ฉันรู้เพื่อให้การอภิปรายดำเนินต่อไป]
การพิมพ์ย่อยโครงสร้างไม่มั่นใจว่าการพิมพ์ย่อยเชิงพฤติกรรมเพราะโครงสร้างของประเภทนั้นอาจตรงกับเหตุผลโดยไม่ได้ตั้งใจ อย่างไรก็ตามการกำหนดพฤติกรรมที่คาดหวังนั้นไม่ใช่เรื่องง่าย ดังนั้นภาษาการเขียนโปรแกรมจำนวนมากใช้จุดกึ่งกลางซึ่งผู้ใช้จะต้องประกาศว่าประเภทใดเป็นประเภทย่อย นี้จะเรียกว่า"เล็กน้อย subtyping" ดูคำถามเกี่ยวกับImplicit vs subtyping โดยละเอียดสำหรับการสนทนาของปัญหานี้ แนวคิดก็คือโปรแกรมเมอร์ต้องให้แน่ใจว่ามีการพิมพ์ย่อยของพฤติกรรมสำหรับชนิดย่อยที่ประกาศทั้งหมดโดยใช้ความฉลาดของเขาเอง ภาษาไม่สามารถให้ความช่วยเหลือใด ๆ ได้ อย่างไรก็ตามประเภทย่อยที่ประกาศทั้งหมดจะต้องเป็นโครงสร้างย่อยอย่างน้อยที่สุด มิฉะนั้นโปรแกรมจะไม่สามารถพิมพ์การตรวจสอบ ภาษาสามารถช่วยรับรองได้ (ภาษาการเขียนโปรแกรมบางภาษาไม่มีระบบชนิดที่ดีพอที่จะตรวจสอบให้แน่ใจว่ามีการรวบรวมเวลาหากเป็นเช่นนั้นระบบจะตรวจพบความผิดพลาดประเภทในเวลาทำงานหรืออาจเกิดผลลัพธ์ที่ผิดพลาด
เมื่อหนึ่งกำหนดคลาสย่อยในโปรแกรมเชิงวัตถุหนึ่งมักจะเพิ่มเขตข้อมูลที่มองเห็นได้สาธารณะ (หรือวิธีการ) ในภาษาการเขียนโปรแกรมส่วนใหญ่คลาสย่อยดังกล่าวถือเป็นชนิดย่อยเล็กน้อย คำถามก็คือพวกมันเป็นโครงสร้างย่อยหรือไม่ หากพวกเขาไม่ใช่เช่นภาษาการเขียนโปรแกรมให้หนึ่งประกาศ subtypes เล็กน้อยที่ไม่ใช่ subtypes โครงสร้างแล้วจะมีรูประเภทในภาษาการเขียนโปรแกรม
ในกรณีง่าย ๆ การเพิ่มเขตข้อมูลทำงานได้ดี ประเภทของซูเปอร์คลาสคาดว่าจะมีฟิลด์น้อยกว่าประเภทของคลาสย่อย ดังนั้นหากคุณเสียบอินสแตนซ์ของคลาสย่อยที่คาดว่าอินสแตนซ์ของ sueprclass โปรแกรมจะละเว้นฟิลด์เพิ่มเติมที่ให้ไว้และไม่มีอะไรผิดพลาด
อย่างไรก็ตามหากซูเปอร์คลาสหรือคลาสย่อยมีวิธีการที่ใช้อาร์กิวเมนต์ประเภทเดียวกันกับตัวเองหรือส่งคืนผลลัพธ์ประเภทเดียวกันกับตัวเองปัญหาจะเกิดขึ้น จากนั้นชนิดอินเตอร์เฟสของคลาสย่อยนั้นไม่ใช่ชนิดย่อยโครงสร้างของซูเปอร์คลาส ภาษาโปรแกรมประเภทที่ปลอดภัยใช้กันอย่างแพร่หลายเช่น Java ไม่อนุญาตคลาสย่อยดังกล่าว ดังนั้นพวกเขาจึงจำกัดภาษาที่จะได้รับความปลอดภัยประเภท การเขียนโปรแกรมภาษาไอเฟลกล่าวกันว่ามีความปลอดภัยแบบเสียสละเพื่อให้ได้ความยืดหยุ่นแทน หากใครออกแบบระบบที่แข็งแกร่งที่คงความยืดหยุ่นไว้เราต้องยอมแพ้หลักการที่คลาสย่อยก่อให้เกิดชนิดย่อย ดังนั้นชื่อของกระดาษ"การสืบทอดไม่ใช่ subtyping". ผู้เขียนเสนอความคิดที่แตกต่างของ subtyping ลำดับสูงกว่าซึ่งทำงานแทน คิมบรูซยังมีข้อเสนอที่เกี่ยวข้องอย่างใกล้ชิดที่เรียกว่า "การจับคู่" ที่บรรลุผลเช่นเดียวกัน ดูการนำเสนอนี้ ยังมีประโยชน์คือกระดาษตำแหน่งของ Andrew Black
ชุมชนซีแมนทิกส์อาจเป็นความผิดสำหรับการเพิกเฉยต่อปัญหาเป็นส่วนใหญ่ เราได้รับการยกย่องแบบดั้งเดิมว่าเป็นปัญหาวิศวกรรมระบบปฏิบัติที่เป็นประโยชน์ทางทฤษฎีเพียงเล็กน้อย หากไม่เป็นเช่นนั้นและมีความหมายบางอย่างทำงานอยู่ในพื้นที่ฉันหวังว่าคนอื่นจะพูดถึงพวกเขา