การสืบทอดนั้นแตกต่างจากการพิมพ์ย่อยอย่างไร


15

ในมุมมองภาษาการเขียนโปรแกรมการพิมพ์ย่อยหมายถึงอะไร ฉันได้ยินมาว่า "มรดกไม่ใช่การพิมพ์ย่อย" แล้วความแตกต่างระหว่างการสืบทอดและการพิมพ์ย่อยคืออะไร


6
ฉันสงสัยว่าคำถามนี้ (และอื่น ๆ เช่นนั้น) อาจถูกนำไปยังไซต์ cs.SE ใหม่เมื่อเข้าสู่เบต้าสาธารณะหรือไม่
Suresh Venkat

1
ยินดีต้อนรับสู่ cstheory เว็บไซต์คำถาม & คำตอบสำหรับคำถามระดับการวิจัยทางวิทยาการคอมพิวเตอร์เชิงทฤษฎี (TCS) คำถามของคุณดูเหมือนจะไม่ใช่คำถามระดับการวิจัยใน TCS โปรดดูคำถามที่พบบ่อยสำหรับข้อมูลเพิ่มเติมเกี่ยวกับความหมายของสิ่งนี้และคำแนะนำสำหรับเว็บไซต์ที่อาจตอบคำถามของคุณ สุดท้ายหากคำถามของคุณถูกปิดเพราะไม่อยู่ในขอบเขตและคุณเชื่อว่าคุณสามารถแก้ไขคำถามเพื่อให้เป็นคำถามระดับการวิจัยได้โปรดอย่าลังเลที่จะทำเช่นนั้น การปิดไม่ใช่เรื่องถาวรและคำถามสามารถเปิดใหม่ได้ตรวจสอบคำถามที่พบบ่อยสำหรับข้อมูลเพิ่มเติม
Kaveh

3
@UURRRED: ไม่มีคำถามที่ไม่สำคัญเมื่อตอบครั้งแรก แต่เราควรตัดสินใจจากมุมมองที่ทันสมัย อาร์กิวเมนต์เดียวกับที่คุณบอกเป็นนัย ๆ ว่าคำถามเกี่ยวกับอัลกอริทึมของ Dijkstra นั้นเป็นหัวข้อเพราะบทความแรกพูดถึงมัน
Tsuyoshi Ito

3
@TsuyoshiIto การเปรียบเทียบไม่เหมาะสมเนื่องจากกระดาษแผ่นแรกของ Dijkstra แก้ไขปัญหาในขณะที่กระดาษแผ่นแรกของ Cardelli ที่นี่สร้างปัญหาขึ้นมา ถึงกระนั้นฉันก็ขอให้คุณชี้ว่าเราไม่ได้ประเมินสถานะของงานศิลปะจากบทความชิ้นแรก ฉันขอยืนยันกับคุณว่าความแตกต่างระหว่างการสืบทอดและการพิมพ์ย่อยไม่ได้เป็นตัวแทนของปัญหาที่แก้ไขแล้วและฉันคาดหวังว่าปัญหาจะได้รับการถกเถียงกันอีกอย่างน้อย 20 ปี ผู้ถามอาจได้รับการแนะนำให้ทำการบ้านเพิ่มเติมและแก้ไขคำถามเพื่อชี้แจงปัญหาระดับการวิจัย
Uday Reddy

3
ไม่ว่าในกรณีใดมันง่ายพอที่จะชี้กระดาษ OP to Cook และคณะที่มีชื่อเดียวกัน: citeseerx.ist.psu.edu/viewdoc/summary?doi=10.1.1.102.8635
Andreas Rossberg

คำตอบ:


18

[ฉันไม่ได้คิดอย่างลึกซึ้งเกี่ยวกับปัญหาของระบบพิมพ์เชิงวัตถุ แต่ฉันจะพูดในสิ่งที่ฉันรู้เพื่อให้การอภิปรายดำเนินต่อไป]

ABABAB

AB

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

เมื่อหนึ่งกำหนดคลาสย่อยในโปรแกรมเชิงวัตถุหนึ่งมักจะเพิ่มเขตข้อมูลที่มองเห็นได้สาธารณะ (หรือวิธีการ) ในภาษาการเขียนโปรแกรมส่วนใหญ่คลาสย่อยดังกล่าวถือเป็นชนิดย่อยเล็กน้อย คำถามก็คือพวกมันเป็นโครงสร้างย่อยหรือไม่ หากพวกเขาไม่ใช่เช่นภาษาการเขียนโปรแกรมให้หนึ่งประกาศ subtypes เล็กน้อยที่ไม่ใช่ subtypes โครงสร้างแล้วจะมีรูประเภทในภาษาการเขียนโปรแกรม

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

อย่างไรก็ตามหากซูเปอร์คลาสหรือคลาสย่อยมีวิธีการที่ใช้อาร์กิวเมนต์ประเภทเดียวกันกับตัวเองหรือส่งคืนผลลัพธ์ประเภทเดียวกันกับตัวเองปัญหาจะเกิดขึ้น จากนั้นชนิดอินเตอร์เฟสของคลาสย่อยนั้นไม่ใช่ชนิดย่อยโครงสร้างของซูเปอร์คลาส ภาษาโปรแกรมประเภทที่ปลอดภัยใช้กันอย่างแพร่หลายเช่น Java ไม่อนุญาตคลาสย่อยดังกล่าว ดังนั้นพวกเขาจึงจำกัดภาษาที่จะได้รับความปลอดภัยประเภท การเขียนโปรแกรมภาษาไอเฟลกล่าวกันว่ามีความปลอดภัยแบบเสียสละเพื่อให้ได้ความยืดหยุ่นแทน หากใครออกแบบระบบที่แข็งแกร่งที่คงความยืดหยุ่นไว้เราต้องยอมแพ้หลักการที่คลาสย่อยก่อให้เกิดชนิดย่อย ดังนั้นชื่อของกระดาษ"การสืบทอดไม่ใช่ subtyping". ผู้เขียนเสนอความคิดที่แตกต่างของ subtyping ลำดับสูงกว่าซึ่งทำงานแทน คิมบรูซยังมีข้อเสนอที่เกี่ยวข้องอย่างใกล้ชิดที่เรียกว่า "การจับคู่" ที่บรรลุผลเช่นเดียวกัน ดูการนำเสนอนี้ ยังมีประโยชน์คือกระดาษตำแหน่งของ Andrew Black

ชุมชนซีแมนทิกส์อาจเป็นความผิดสำหรับการเพิกเฉยต่อปัญหาเป็นส่วนใหญ่ เราได้รับการยกย่องแบบดั้งเดิมว่าเป็นปัญหาวิศวกรรมระบบปฏิบัติที่เป็นประโยชน์ทางทฤษฎีเพียงเล็กน้อย หากไม่เป็นเช่นนั้นและมีความหมายบางอย่างทำงานอยู่ในพื้นที่ฉันหวังว่าคนอื่นจะพูดถึงพวกเขา


1
บางทีมันก็คุ้มค่าที่จะกล่าวถึงว่ามีภาษาจริง ๆ อยู่ที่นั่นซึ่งแยกย่อยจากการสืบทอดได้สำเร็จเช่น Ocaml ในระบบวัตถุ
Andreas Rossberg

@ AndreasRossberg แน่นอน OCaml ไม่ได้อยู่ในกรอบของฉันเมื่อฉันเขียนคำตอบนั้น ฉันคิดว่า OCaml ไม่มี subtyping เล็กน้อยเลย ดังนั้นประเด็นเหล่านี้จะไม่เกิดขึ้น แต่มีความเป็นไปได้ที่ประเภทอาจจะจับคู่กันโดยไม่ตั้งใจแม้ว่าพฤติกรรมจะไม่ได้และระบบประเภทจะไม่สามารถช่วยตรวจจับข้อผิดพลาดประเภทนั้นได้
Uday Reddy
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.