คำถามติดแท็ก multiple-inheritance

9
มีเหตุผล "ของจริง" ที่ไม่ชอบการสืบทอดหลายครั้งหรือไม่
ฉันชอบความคิดที่ว่าจะมีหลายมรดกที่สนับสนุนในภาษา ส่วนใหญ่มักจะลืมมันโดยเจตนาและ "การแทนที่" ที่ควรจะเป็นอินเตอร์เฟส การเชื่อมต่อก็ไม่ได้ครอบคลุมการสืบทอดหลาย ๆ อันเหมือนกันทั้งหมดและข้อ จำกัด นี้บางครั้งอาจนำไปสู่รหัสสำเร็จรูปมากขึ้น เหตุผลพื้นฐานเดียวที่ฉันเคยได้ยินเรื่องนี้คือปัญหาเพชรกับชั้นเรียนพื้นฐาน ฉันไม่สามารถยอมรับได้ สำหรับฉันมันหลุดออกมามากมายเช่น "เอาละมันเป็นไปได้ที่จะพลาดมันดังนั้นมันจึงเป็นความคิดที่ไม่ดีโดยอัตโนมัติ" คุณสามารถทำอะไรผิดพลาดในภาษาการเขียนโปรแกรมและฉันหมายถึงอะไร ฉันไม่สามารถทำสิ่งนี้ได้อย่างจริงจังอย่างน้อยก็ไม่ใช่โดยไม่ต้องอธิบายให้ละเอียด เพียงตระหนักถึงปัญหานี้ 90% ของการต่อสู้ นอกจากนี้ฉันคิดว่าฉันได้ยินบางสิ่งบางอย่างเมื่อหลายปีก่อนเกี่ยวกับวัตถุประสงค์ทั่วไปที่เกี่ยวข้องกับอัลกอริทึม "ซองจดหมาย" หรืออะไรทำนองนั้น (เสียงกริ่งดังขึ้นทุกคนหรือไม่) ปัญหาเกี่ยวกับเพชรปัญหาของแท้ที่ฉันอาจนึกได้คือถ้าคุณพยายามใช้ห้องสมุดบุคคลที่สามและไม่เห็นว่าสองคลาสที่ไม่เกี่ยวข้องกันดูเหมือนว่าในห้องสมุดนั้นมีคลาสพื้นฐานร่วมกัน แต่นอกเหนือไปจาก เอกสารคุณสมบัติของภาษาที่ง่ายอาจทำให้คุณต้องการประกาศความตั้งใจในการสร้างข้าวหลามตัดก่อนที่จะทำการรวบรวมเพชรให้คุณ ด้วยคุณสมบัติเช่นนี้การสร้างเพชรใด ๆ ก็อาจเป็นการจงใจไม่ประมาทหรือเพราะไม่มีใครรู้ถึงความผิดพลาดนี้ เพื่อให้ทุกคนพูดว่า ... มีเหตุผลจริงหรือที่คนส่วนใหญ่เกลียดชังมรดกหลายอย่างหรือว่ามันเป็นเพียงแค่กลุ่มฮิสทีเรียที่ก่อให้เกิดอันตรายมากกว่าดี? มีบางอย่างที่ฉันไม่เห็นใช่ไหม ขอขอบคุณ. ตัวอย่าง รถขยาย WheeledVehicle, KIASpectra ขยายรถยนต์และอิเล็กทรอนิกส์ KIASpectra มีวิทยุ เหตุใด KIASpectra จึงไม่มี Electronic เพราะมันเป็นอิเล็กทรอนิกส์ การสืบทอดกับการจัดองค์ประกอบควรเป็นความสัมพันธ์แบบ is-a กับความสัมพันธ์แบบ a-a เพราะมันเป็นอิเล็กทรอนิกส์ …

1
มิกซ์อินหรือลักษณะนิสัยดีกว่าการรับมรดกหลายแบบธรรมดาอย่างไร
C ++ มีการสืบทอดหลายแบบธรรมดาการออกแบบหลายภาษานั้นห้ามมิให้มีอันตราย แต่ภาษาบางภาษาเช่น Ruby และ PHP ใช้ไวยากรณ์แปลก ๆ เพื่อทำสิ่งเดียวกันและเรียกว่า mixins หรือลักษณะ ฉันได้ยินมาหลายครั้งแล้วว่ามิกซ์อิน / คุณลักษณะนั้นยากต่อการทารุณมากกว่าการถ่ายทอดทางพันธุกรรมที่หลากหลาย อะไรที่ทำให้พวกเขามีอันตรายน้อยลง? มีบางสิ่งที่เป็นไปไม่ได้สำหรับ mixins / traits แต่เป็นไปได้ด้วย C ++ - กำหนดลักษณะการสืบทอดหลาย ๆ แบบ? เป็นไปได้ที่จะพบปัญหาเพชรกับพวกเขาหรือไม่? ดูเหมือนว่าเราใช้มรดกหลายอย่าง แต่เพียงแค่แก้ตัวว่ามันเป็นส่วนผสม / คุณลักษณะเพื่อให้เราสามารถใช้มันได้

6
การสืบทอดหลายรายการละเมิดหลักการความรับผิดชอบแบบเดี่ยวหรือไม่?
หากคุณมีคลาสที่สืบทอดมาจากคลาสที่แตกต่างกันสองคลาสนี่หมายความว่าคลาสย่อยของคุณทำสิ่งต่าง ๆ โดยอัตโนมัติ (อย่างน้อย) 2 อย่างสิ่งหนึ่งจากคลาสซุปเปอร์แต่ละอัน? ฉันเชื่อว่าไม่มีความแตกต่างหากคุณมีการสืบทอดหลายอินเตอร์เฟส แก้ไข: เพื่อความชัดเจนฉันเชื่อว่าหากคลาสย่อยหลายคลาสละเมิด SRP จากนั้นใช้หลายอินเทอร์เฟซ (ไม่ใช่ตัวทำเครื่องหมายหรืออินเทอร์เฟซพื้นฐาน (เช่นที่เปรียบเทียบได้)) ละเมิด SRP ด้วย

2
ลักษณะในสกาล่าหลีกเลี่ยง "ข้อผิดพลาดของเพชร" ได้อย่างไร
(หมายเหตุ: ฉันใช้ 'ข้อผิดพลาด' แทน 'ปัญหา' ในชื่อด้วยเหตุผลที่ชัดเจน .. ;)) ฉันได้อ่านพื้นฐานเกี่ยวกับลักษณะนิสัยในสกาล่า มันคล้ายกับอินเตอร์เฟสใน Java หรือ C # แต่อนุญาตให้มีการใช้งานเมธอดที่เป็นค่าเริ่มต้น ฉันสงสัยว่า: สิ่งนี้ไม่สามารถทำให้เกิดปัญหา "ปัญหาเพชร" ได้หรือไม่ซึ่งเป็นเหตุผลว่าทำไมหลาย ๆ ภาษาจึงหลีกเลี่ยงการสืบทอดหลายอย่างตั้งแต่แรก? ถ้าเป็นเช่นนั้นสกาล่าจัดการเรื่องนี้อย่างไร?

5
วิธีหลีกเลี่ยงปัญหาที่เหมาะสมสำหรับการสืบทอดหลาย ๆ อย่างใน Java (Android)
ฉันมีปัญหาด้านแนวคิดเกี่ยวกับการติดตั้งโค้ดอย่างเหมาะสมซึ่งดูเหมือนว่าต้องใช้การสืบทอดหลายแบบซึ่งจะไม่เป็นปัญหาในหลายภาษา OO แต่เนื่องจากโปรเจ็กต์สำหรับ Android ไม่มีสิ่งเช่นหลายextendsอย่าง ฉันมีพวงของกิจกรรมที่ได้มาจากฐานเรียนที่แตกต่างกันเช่นที่เรียบง่ายActivity, TabActivity, ListActivity, ExpandableListActivityฯลฯ นอกจากนี้ฉันมีเศษรหัสบางอย่างที่ฉันต้องไปยังสถานที่ลงในonStart, onStop,onSaveInstanceState , onRestoreInstanceStateและอื่น ๆ ที่จัดการเหตุการณ์มาตรฐานในทุกกิจกรรม ถ้าฉันมีคลาสฐานเดียวสำหรับทุกกิจกรรมฉันจะวางโค้ดลงในคลาสที่ได้รับมาจากระดับกลางพิเศษจากนั้นสร้างกิจกรรมทั้งหมดที่ขยายออกมา น่าเสียดายที่นี่ไม่ใช่กรณีเนื่องจากมีหลายคลาสพื้นฐาน แต่การวางส่วนของรหัสเดียวกันลงในคลาสกลางหลาย ๆ คลาสนั้นไม่ใช่วิธีที่จะทำได้ อีกวิธีหนึ่งคือการสร้างวัตถุผู้ช่วยและมอบหมายการโทรเหตุการณ์ทั้งหมดที่กล่าวไว้ข้างต้นให้กับผู้ช่วย แต่สิ่งนี้ต้องการวัตถุผู้ช่วยที่จะรวมและตัวจัดการทั้งหมดจะถูกกำหนดใหม่ในชั้นกลางทั้งหมด ดังนั้นจึงไม่มีความแตกต่างกับวิธีแรกที่นี่ - ยังคงมีการทำสำเนารหัสจำนวนมาก หากมีสถานการณ์คล้ายกันเกิดขึ้นใน Windows ฉันต้องการคลาสย่อยฐานรอง (สิ่งที่ "สอดคล้อง" กับ Activityคลาสใน Android) และดักจับข้อความที่เหมาะสมที่นั่น (ในที่เดียว) Java / Android สามารถทำอะไรได้บ้าง? ฉันรู้ว่ามีเครื่องมือที่น่าสนใจเช่นเครื่องมือJava ( พร้อมตัวอย่างจริง ) แต่ฉันไม่ใช่กูรู Java และไม่แน่ใจว่ามันคุ้มค่าที่จะลองในกรณีเฉพาะนี้หรือไม่ หากฉันพลาดวิธีแก้ปัญหาที่เหมาะสมอื่น ๆ โปรดพูดถึงพวกเขา UPDATE: …

7
กรณีการใช้หลายมรดก
Java ละเว้นมรดกหลายในบริเวณที่มัน obviates เป้าหมายการออกแบบของการรักษาภาษาที่เรียบง่าย ฉันสงสัยว่า Java (พร้อมระบบนิเวศน์) นั้น "ง่าย" หรือไม่ Python ไม่ซับซ้อนและมีหลายมรดก ดังนั้นโดยไม่เป็นส่วนตัวเกินไปคำถามของฉันคือ ... รูปแบบของปัญหาทั่วไปที่ได้รับประโยชน์จากรหัสที่ออกแบบมาเพื่อใช้ประโยชน์จากการสืบทอดหลายอย่างมากคืออะไร

2
C ++ มีวิธีจัดการหลายมรดกด้วยบรรพบุรุษร่วมกันอย่างไร
ฉันไม่ใช่คน C ++ แต่ฉันถูกบังคับให้คิดเกี่ยวกับเรื่องนี้ เหตุใดจึงมีการสืบทอดหลายรายการใน C ++ แต่ไม่ใช่ใน C # (ฉันรู้ปัญหาเพชรแต่นั่นไม่ใช่สิ่งที่ฉันถามที่นี่) C ++ แก้ไขความคลุมเครือของลายเซ็นวิธีที่เหมือนกันซึ่งสืบทอดมาจากคลาสพื้นฐานหลายคลาสได้อย่างไร และทำไมการออกแบบเดียวกันไม่รวมอยู่ใน C #

4
ลำดับชั้นแบบขนาน - เหมือนกันบางส่วนแตกต่างกันเล็กน้อย
มีคำถามที่คล้ายกันอยู่สองสามข้อ 1 ,2 ,3 ,4แต่ดูเหมือนว่าไม่ใช่ในกรณีของคำถามนี้และการแก้ปัญหาก็ดูดีที่สุด นี่เป็นคำถามทั่วไปของ OOP โดยสมมติว่ามีหลายรูปแบบชื่อสามัญและมิกซ์อินมีอยู่ ภาษาจริงที่ใช้คือ OOP Javascript (Typescript) แต่เป็นปัญหาเดียวกันใน Java หรือ C ++ ฉันมีลำดับชั้นของชั้นเรียนแบบขนานซึ่งบางครั้งก็มีพฤติกรรมที่เหมือนกัน (ส่วนต่อประสานและการใช้งาน) แต่บางครั้งก็มีพฤติกรรมที่ 'ได้รับการป้องกัน' ของตัวเอง ภาพประกอบดังนี้: นี้สำหรับวัตถุประสงค์ในการประกอบการอธิบายเท่านั้น ; มันไม่ใช่แผนภาพคลาสที่แท้จริง หากต้องการอ่าน: สิ่งใดก็ตามในลำดับชั้นทั่วไป (กลาง) จะแชร์กันระหว่างทั้ง Canvas (ซ้าย) และ SVG (ขวา) ด้วยการแบ่งปันฉันหมายถึงทั้งอินเทอร์เฟซและการใช้งาน สิ่งใดก็ตามที่อยู่บนคอลัมน์ซ้ายหรือขวาหมายถึงพฤติกรรม (วิธีการและสมาชิก) เฉพาะสำหรับลำดับชั้นนั้น ตัวอย่างเช่น: ทั้งลำดับชั้นซ้ายและขวาใช้กลไกการตรวจสอบความถูกต้องเดียวกันแสดงเป็นวิธีการเดียว ( Viewee.validate()) ในลำดับชั้นทั่วไป paint()เพียงลำดับชั้นของผ้าใบมีวิธีการ วิธีนี้เรียกวิธีการทาสีบนเด็กทุกคน ลำดับชั้น SVG จำเป็นต้องแทนที่addChild()วิธีการCompositeแต่ไม่ได้เป็นกรณีที่มีลำดับชั้นของผืนผ้าใบ โครงสร้างจากลำดับชั้นทั้งสองไม่สามารถผสมกันได้ …

4
ทางเลือกแทนมรดกหลายอย่างสำหรับสถาปัตยกรรมของฉัน (NPC ในเกมกลยุทธ์เรียลไทม์)?
การเข้ารหัสไม่ว่าหนักจริง ส่วนที่ยากคือการเขียนโค้ดที่อ่านเข้าใจง่าย ดังนั้นฉันต้องการได้นักพัฒนาที่ดีขึ้นและสร้างสถาปัตยกรรมที่มั่นคง ดังนั้นฉันต้องการสร้างสถาปัตยกรรมสำหรับNPCในวิดีโอเกม มันเป็นเกม Realtime Strategy เช่น Starcraft, Age of Empires, Command & Conquers ฯลฯ ดังนั้นฉันจะมี NPC หลายแบบ NPC สามารถมีความสามารถจำนวนมาก (วิธีการ) ของเหล่านี้: Build(), และFarm()Attack() ตัวอย่าง: คนทำงานสามารถBuild()และFarm() นักรบสามารถAttack() CitizenสามารถBuild(), Farm()และAttack() ชาวประมงสามารถFarm()และAttack() ฉันหวังว่าทุกอย่างจะชัดเจน ดังนั้นตอนนี้ฉันมีประเภท NPC และความสามารถของพวกเขา แต่ลองมาที่ด้านเทคนิค / โปรแกรมด้านเทคนิค สถาปัตยกรรมการเขียนโปรแกรมที่ดีสำหรับ NPC ชนิดต่าง ๆ ของฉันจะเป็นอย่างไร โอเคฉันสามารถมีคลาสพื้นฐานได้ จริงๆแล้วฉันคิดว่านี่เป็นวิธีที่ดีในการยึดมั่นในหลักการของDRY ดังนั้นฉันสามารถมีวิธีการเหมือนWalkTo(x,y)ในคลาสพื้นฐานของฉันเนื่องจาก NPC ทุกคนจะสามารถเคลื่อนไหวได้ แต่ตอนนี้มาถึงปัญหาที่แท้จริง ฉันจะใช้ความสามารถของฉันได้ที่ไหน …

1
การใช้คำสั่งการแก้ไขวิธีการของ Python สำหรับการฉีดที่ต้องพึ่งพา - นี่มันแย่ไหม?
ฉันดู Pycon ของ Raymond Hettinger พูดว่า "Super Considered Super" และเรียนรู้เล็กน้อยเกี่ยวกับ PROON ของ MRO (Method Resolution Order) ซึ่งทำให้ชั้นเรียนเป็น "ผู้ปกครอง" ในลักษณะเชิงเส้น เราสามารถใช้สิ่งนี้เพื่อประโยชน์ของเราเช่นในรหัสด้านล่างเพื่อทำการฉีดพึ่งพา ตอนนี้ตามธรรมชาติฉันต้องการใช้superสำหรับทุกสิ่ง! ในตัวอย่างด้านล่างที่Userระดับประกาศอ้างอิงมันโดยการสืบทอดจากทั้งสองและLoggingService UserServiceนี่ไม่ใช่สิ่งที่พิเศษเป็นพิเศษ ส่วนที่น่าสนใจคือเราสามารถใช้การแก้ไขวิธีสั่งซื้อยังจำลองการอ้างอิงในระหว่างการทดสอบหน่วย โค้ดด้านล่างนี้สร้างสิ่งMockUserServiceที่สืบทอดมาUserServiceและนำเสนอวิธีการที่เราต้องการจำลอง validate_credentialsในตัวอย่างด้านล่างเราให้การดำเนินการของ เพื่อที่จะได้MockUserServiceจัดการกับการโทรใด ๆ ที่validate_credentialsเราจำเป็นต้องวางไว้ก่อนUserServiceใน MRO นี้ทำได้โดยการสร้างชั้นห่อหุ้มรอบUserเรียกว่าMockUserและมีมันสืบทอดมาจากและUserMockUserService ตอนนี้เมื่อเราทำMockUser.authenticateและในทางกลับกันการเรียกใช้มาsuper().validate_credentials() MockUserServiceก่อนUserServiceในการสั่งซื้อวิธีการแก้ปัญหาและเนื่องจากมีการใช้งานที่เป็นรูปธรรมของvalidate_credentialsการดำเนินการนี้จะถูกนำมาใช้ Yay - เราประสบความสำเร็จUserServiceในการทดสอบหน่วยการเรียนรู้ของเรา พิจารณาว่าUserServiceอาจทำการโทรผ่านเครือข่ายหรือฐานข้อมูลราคาแพง - เราเพิ่งลบปัจจัยแฝงของสิ่งนี้ นอกจากนี้ยังไม่มีความเสี่ยงในการUserServiceสัมผัสข้อมูลสด / กระทุ้ง class LoggingService(object): """ Just a contrived logging class …

2
การสืบทอดของ Python เป็นรูปแบบของ "is-a" ของการสืบทอดหรือสไตล์การแต่งหรือไม่?
เนื่องจาก Python อนุญาตให้ใช้การสืบทอดหลายแบบการถ่ายทอดทางพันธุกรรมใน Python มีลักษณะอย่างไร ในภาษาที่มีการสืบทอดเดียวเช่น Java การสืบทอดจะถูกใช้เมื่อคุณสามารถพูดได้ว่าวัตถุหนึ่ง "is-a" ของวัตถุอื่นและคุณต้องการแบ่งปันรหัสระหว่างวัตถุ (จากวัตถุหลักไปยังวัตถุลูก) ตัวอย่างเช่นคุณสามารถพูดได้ว่าDogเป็นAnimal: public class Animal {...} public class Dog extends Animal {...} แต่เนื่องจาก Python รองรับการสืบทอดหลายแบบเราจึงสามารถสร้างวัตถุโดยการรวมวัตถุอื่นเข้าด้วยกัน ลองพิจารณาตัวอย่างด้านล่าง: class UserService(object): def validate_credentials(self, username, password): # validate the user credentials are correct pass class LoggingService(object): def log_error(self, error): # log an error pass …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.