ทำไม C # ไม่รองรับการสืบทอดหลาย ๆ


10

แม้ว่ามันอาจเป็นวิธีปฏิบัติที่ไม่ดีฉันจะบอกว่ามีเวลาที่มันจะบรรลุวัตถุประสงค์


1
ฉันรักที่ทุกคนแก้ตัวทั้งหมดนี้เพราะขาดความสามารถที่เป็นประโยชน์อย่างสมบูรณ์ในสิ่งที่ Microsoft สร้างขึ้น (MVP เป็นผู้เชี่ยวชาญในเรื่องนี้โดยเฉพาะ) ฉันเดาว่าคนส่วนใหญ่ที่ไม่เข้าใจถึงประโยชน์ของการสืบทอดหลาย ๆ อย่างนั้นเป็นคนที่ไม่เข้าใจการสืบทอด (และไม่ใช้) ตั้งแต่แรกเพราะพวกเขาชอบการคัดลอกและที่นิยมกันมาก วางรหัส 20 ครั้งที่ฉันเห็นในเกือบทุกโครงการทุกที่ ไม่ต้องสงสัยเลยว่าเมื่อไรและเมื่อ Microsoft ตัดสินใจใช้ MI ทุกคนจะกลายเป็นคนที่กระตือรือร้นอย่างฉับพลันไม่ต้องรอ "ผู้เผยแพร่ศาสนา" โดยอ้างว่า

1
@DaveZiffer อาจเป็นไปได้ แต่ดูเหมือนจะยากที่จะทำให้ถูกต้อง คุณรู้ภาษาหรือการติดตั้งใช้งานได้ดีจริง ๆ ไหม?

4
@Dave หรือคุณประเมินค่าสูงเกินไปประโยชน์ของมัน การสืบทอดโดยทั่วไปเป็นวิธีที่ overrated และกรณีที่ขาดหายไปสามารถสร้างแบบจำลองได้อย่างง่ายดายโดยใช้อินเตอร์เฟซและองค์ประกอบ การสืบทอดหลายอย่างนั้นไม่มีประโยชน์ใน C # ข้อได้เปรียบเดียวที่มีคือมัน obviates จำเป็นต้องมอบหมายวิธีการอินเทอร์เฟซด้วยตนเองเพื่อการใช้งานในสมาชิกคอมโพสิต สิ่งนี้สามารถแก้ไขได้ดีกว่า (เช่นโดยการแนะนำมิกซ์อิน) แต่ก็ไม่มีเหตุผลที่ดีที่จะแนะนำการสืบทอดหลายแบบ
Konrad Rudolph

ฉันเขียนโค๊ต OO เป็นเวลาหลายปีแล้วตอนนี้ใช้การสืบทอดอย่างสมเหตุสมผล (บางครั้งน้อยกว่าเมื่อฉันเรียนรู้ได้ดีขึ้น) และฉันพบว่า 1 ครั้งเมื่อมันยากมากที่จะได้รับการสืบทอดหลายครั้งและอาจ 10 ครั้ง ที่ฉันสามารถใช้เพื่อทำให้การออกแบบปัจจุบันของฉันง่ายขึ้น - และเป็นศูนย์ครั้งเดียวเมื่อฉันไม่สามารถกำหนดใหม่ได้โดยไม่ต้องสืบทอดหลาย ๆ ครั้งและมีการออกแบบโดยรวมดีกว่าที่เคยเป็นมา
Bill K

คำตอบ:


14

/programming/995255/why-is-multiple-inheritance-not-allowed-in-java-or-cครอบคลุมคำถามนี้เป็นอย่างดี

สิ่งที่ฉันทำคือ: นักออกแบบอาจต้องการสร้างภาษาที่ส่งเสริมหลักการออกแบบที่ดี ตกลงดังนั้นจึงมีบางครั้งที่มรดกหลายอย่างสมบูรณ์แบบ นี่เป็นข้อยกเว้นแทนที่จะเป็นกฎและสามารถถูกทารุณกรรมได้ง่ายมาก ดังนั้นผู้ออกแบบจึงตัดสินใจที่จะทำไม่ได้

สำหรับกรณีที่ควรใช้อินเทอร์เฟซ งานเหล่านั้นแม้ว่าจะเงอะงะ แต่คุณจะไม่ต้องการสิ่งนั้นมากนัก


8

เพียงเพื่อแสดงให้เห็นว่าทำไมไม่สนับสนุนมรดกหลายรายการโดย C ++ แต่มีกำลังใจอย่างมากเนื่องจากคุณสามารถทำสิ่งต่างๆให้สำเร็จด้วยองค์ประกอบที่คุณทำกับ MI ได้อย่างไรก็ตามในรูปแบบที่สะอาดกว่า ซึ่งแตกต่างจาก C ++, C # ไม่ใช่ภาษา OOP ประเภท "ไฮบริด" นั่นคือไม่ได้พัฒนามาจากภาษาก่อนหน้า

หากคุณต้องการรับมรดกหลายรายการคุณสามารถใช้หลายอินเตอร์เฟสได้


6

Walter Bright เป็นทั้งผู้สร้าง D ซึ่งไม่รวม MI และเป็นคนเดียวที่เคยเขียนคอมไพเลอร์ C ++ ทั้งหมดด้วยตัวเอง ตามที่เขาพูดเหตุผลที่ D ขาด MI ก็คือมันยากเกินไปที่จะสร้างระบบของ MI ที่มีประสิทธิภาพพร้อมกันง่ายและมีประโยชน์ ฉันสงสัยว่า Java และ C # ใช้เหตุผลที่คล้ายกัน ภาษาเช่น Perl และ Python ไม่มีประสิทธิภาพเป็นเป้าหมายหลักดังนั้นพวกเขาจึงมีระบบที่เรียบง่ายและมีประโยชน์ แต่ยากที่จะใช้อย่างมีประสิทธิภาพ C ++ ดูเหมือนจะไม่ได้มีความเรียบง่ายเป็นเป้าหมายดังนั้นมันจึงสร้างระบบที่ซับซ้อนอย่างมากที่ไม่มีใครเข้าใจ

ฉันคิดว่าวอลเตอร์ถูกต้องกับเป้าหมาย หากมีภาษาใด ๆ ที่มีระบบ MI ที่ตรงกับเกณฑ์ทั้งสามนี้ด้วยดีโปรดแสดงความคิดเห็น


2
คุณคิดอย่างไรเกี่ยวกับ Eiffel, Common Lisp และ Dylan ฉันรู้ว่าทั้งสามคนนั้นเรียบง่ายและมีประโยชน์ และฉันรู้ว่า Common LISP และ Dylan สามารถแข่งขันและแม้แต่เอาชนะ C ++ (และบ่อยครั้งแม้แต่ C) ในการแสดงดังนั้นดูเหมือนว่าจะมีประสิทธิภาพ ผมไม่ทราบว่าไอเฟลคอมไพเลอร์เป็นอย่างน่ากลัวช้า แต่ฉันรู้ว่าไปเพื่ออะไรเกี่ยวกับประสิทธิภาพของรหัสเรียบเรียงมันผลิต
Jörg W Mittag


-1

เนื่องจากผู้ออกแบบภาษาต้องการที่จะสร้าง C ++ ที่ดีกว่าไม่ใช่ภาษาที่ดีกว่าโดยทั่วไป (สามารถถกเถียงว่าพวกเขาประสบความสำเร็จแค่ไหน)

C ++ - การสืบทอดหลายสไตล์มีปัญหาบางอย่างดังนั้นผู้คนที่ได้รับจาก C ++ มักจะละเว้น (Java, C #, D) ภาษาอื่น ๆ , ไอเฟลและเสียงกระเพื่อมสามัญเพื่อชื่อสอง, ทำมันแตกต่างกันและดูเหมือนจะไม่มีปัญหาเดียวกัน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.