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

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

16
มิกซ์อินคืออะไรและทำไมจึงมีประโยชน์
ใน " Programming Python " Mark Markz พูดถึง "mixins" ฉันมาจากพื้นหลัง C / C ++ / C # และฉันไม่เคยได้ยินคำศัพท์มาก่อน มิกซ์อินคืออะไร? การอ่านระหว่างบรรทัดของตัวอย่างนี้ (ซึ่งฉันเชื่อมโยงเพราะมันค่อนข้างยาว) ฉันคิดว่ามันเป็นกรณีของการใช้การสืบทอดหลาย ๆ แบบเพื่อขยายชั้นเรียนซึ่งตรงข้ามกับการทำคลาสย่อย 'ที่เหมาะสม' ถูกต้องหรือไม่ เหตุใดฉันจึงต้องการทำเช่นนั้นแทนที่จะใส่ฟังก์ชันใหม่ลงในคลาสย่อย สำหรับเรื่องนั้นทำไมการผสมผสานมิกซ์ / การสืบทอดหลายวิธีจึงดีกว่าการใช้การแต่งเพลง? อะไรคือสิ่งที่แยกมิกซ์อินจากการสืบทอดหลาย ๆ ด้าน? มันเป็นเพียงเรื่องของความหมายหรือไม่?

15
Python super () ทำงานอย่างไรกับหลายมรดก
ฉันค่อนข้างใหม่ในการเขียนโปรแกรมเชิงวัตถุของ Python และฉันมีปัญหาในการเข้าใจsuper()ฟังก์ชั่น (คลาสสไตล์ใหม่) โดยเฉพาะอย่างยิ่งเมื่อพูดถึงการสืบทอดหลาย ๆ อย่าง ตัวอย่างเช่นถ้าคุณมีสิ่งที่ชอบ: class First(object): def __init__(self): print "first" class Second(object): def __init__(self): print "second" class Third(First, Second): def __init__(self): super(Third, self).__init__() print "that's it" สิ่งที่ฉันไม่ได้รับคือ: Third()ชั้นเรียนจะสืบทอดทั้งตัวสร้างวิธีการหรือไม่ ถ้าใช่แล้วจะใช้อันไหนกับ super () และทำไมล่ะ และถ้าคุณต้องการเรียกใช้อีกอันหนึ่ง ฉันรู้ว่ามันมีบางอย่างเกี่ยวกับการสั่งซื้อการแก้ไขวิธี Python ( MRO )

16
การสืบทอดหลายรายการใน C #
เนื่องจากการสืบทอดหลายครั้งไม่ดี (ทำให้แหล่งซับซ้อนมากขึ้น) C # ไม่ได้จัดรูปแบบดังกล่าวโดยตรง แต่บางครั้งมันจะมีประโยชน์ที่จะมีความสามารถนี้ ตัวอย่างเช่นฉันสามารถใช้รูปแบบการสืบทอดหลายแบบที่ขาดหายไปโดยใช้อินเตอร์เฟสและคลาสสามคลาสดังนี้: public interface IFirst { void FirstMethod(); } public interface ISecond { void SecondMethod(); } public class First:IFirst { public void FirstMethod() { Console.WriteLine("First"); } } public class Second:ISecond { public void SecondMethod() { Console.WriteLine("Second"); } } public class FirstAndSecond: IFirst, ISecond { First …

6
การเรียกคลาสผู้ปกครอง __init__ ที่มีหลายมรดกวิธีที่ถูกต้องคืออะไร?
ว่าฉันมีสถานการณ์สืบทอดหลาย: class A(object): # code for A here class B(object): # code for B here class C(A, B): def __init__(self): # What's the right code to write here to ensure # A.__init__ and B.__init__ get called? มีสองวิธีทั่วไปเพื่อเขียนเป็นC's __init__: (แบบเก่า) ParentClass.__init__(self) (ใหม่สไตล์) super(DerivedClass, self).__init__() อย่างไรก็ตามในกรณีใดกรณีหนึ่งถ้าคลาสแม่ ( AและB) ไม่ปฏิบัติตามแบบแผนเดียวกันรหัสจะทำงานไม่ถูกต้อง (บางคนอาจพลาดหรือถูกเรียกหลายครั้ง) ดังนั้นวิธีที่ถูกต้องอีกครั้งคืออะไร? มันง่ายที่จะพูดว่า …

16
Java หลายมรดก
ในความพยายามที่จะเข้าใจวิธีแก้ปัญหาการสืบทอดหลายอย่างของ Java อย่างสมบูรณ์ฉันมีคำถามแบบคลาสสิกที่ฉันต้องการชี้แจง ให้บอกว่าฉันมีคลาสAnimalนี้มีคลาสย่อยBirdและHorseและฉันจำเป็นต้องทำคลาสPegasusที่ขยายจากBirdและHorseเนื่องจากPegasusเป็นทั้งนกและม้า ฉันคิดว่านี่เป็นปัญหาเพชรแบบดั้งเดิม จากสิ่งที่ฉันสามารถเข้าใจวิธีที่คลาสสิกที่จะแก้ปัญหานี้คือการทำให้Animal, BirdและHorseการเชื่อมต่อการเรียนและการดำเนินการPegasusจากพวกเขา ฉันสงสัยว่ามีวิธีอื่นในการแก้ปัญหาที่ฉันยังสามารถสร้างวัตถุสำหรับนกและม้าได้หรือไม่ หากมีวิธีที่จะสามารถสร้างสัตว์ก็จะดี แต่ไม่จำเป็น


9
วิธีสร้างคลาส Java ที่ใช้หนึ่งอินเตอร์เฟสที่มีสองประเภททั่วไป?
ฉันมีอินเทอร์เฟซทั่วไป public interface Consumer<E> { public void consume(E e); } ฉันมีคลาสที่ใช้วัตถุสองประเภทดังนั้นฉันต้องการทำสิ่งที่ชอบ: public class TwoTypesConsumer implements Consumer<Tomato>, Consumer<Apple> { public void consume(Tomato t) { ..... } public void consume(Apple a) { ...... } } เห็นได้ชัดว่าฉันไม่สามารถทำเช่นนั้นได้ แน่นอนฉันสามารถใช้การจัดส่งได้เองเช่น public class TwoTypesConsumer implements Consumer<Object> { public void consume(Object o) { if (o instanceof Tomato) …

2
Mixins vs. Traits
อะไรคือความแตกต่างระหว่าง Mixins กับลักษณะ? ตามวิกิพีเดียโมดูลทับทิมมีลักษณะเหมือน งั้นเหรอ

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

7
อินเทอร์เฟซสามารถขยายหลายอินเทอร์เฟซใน Java ได้หรือไม่?
อินเทอร์เฟซสามารถขยายหลายอินเทอร์เฟซใน Java ได้หรือไม่? รหัสนี้ถูกต้องใน IDE ของฉันและจะรวบรวม: interface Foo extends Runnable, Set, Comparator<String> { } แต่ฉันเคยได้ยินมาว่าไม่อนุญาตให้มีการสืบทอดหลายรายการใน Java เหตุใดจึงมีข้อยกเว้นสำหรับอินเทอร์เฟซ

11
ปัญหาที่แน่นอนเกี่ยวกับการสืบทอดหลายรายการคืออะไร?
ฉันเห็นคนถามตลอดเวลาว่าควรรวมการสืบทอดหลายรายการไว้ใน C # หรือ Java เวอร์ชันถัดไปหรือไม่ ชาว C ++ ที่โชคดีพอที่จะมีความสามารถนี้บอกว่านี่เหมือนกับการให้เชือกใครสักคนเพื่อแขวนคอตัวเองในที่สุด มรดกหลายรายการมีอะไรบ้าง? มีตัวอย่างคอนกรีตหรือไม่?

17
เหตุใดการสืบทอดหลายรายการจึงไม่อนุญาตใน Java หรือ C #
ฉันรู้ว่าไม่อนุญาตให้มีการสืบทอดหลายรายการใน Java และ C # หนังสือหลายเล่มบอกว่าไม่อนุญาตให้มีการสืบทอดหลาย ๆ แต่สามารถใช้งานได้โดยใช้อินเทอร์เฟซ ไม่มีการพูดคุยเกี่ยวกับสาเหตุที่ไม่อนุญาต ใครช่วยบอกทีว่าทำไมถึงไม่อนุญาต?

6
การสืบทอดหลายรายการสำหรับคลาสที่ไม่ระบุชื่อ
คลาสที่ไม่ระบุชื่อสามารถใช้สองอินเทอร์เฟซ (หรือมากกว่า) ได้อย่างไร? หรืออีกวิธีหนึ่งวิธีที่สามารถมันทั้งขยายชั้นเรียนและการใช้อินเตอร์เฟซอยู่แล้ว? ตัวอย่างเช่นฉันต้องการสร้างออบเจ็กต์ของคลาสที่ไม่ระบุชื่อที่ขยายสองอินเทอร์เฟซ: // Java 10 "var" is used since I don't know how to specify its type var lazilyInitializedFileNameSupplier = (new Supplier<String> implements AutoCloseable)() { private String generatedFileName; @Override public String get() { // Generate file only once if (generatedFileName == null) { generatedFileName = generateFile(); } …

5
การสืบทอดเสมือนช่วยแก้ความคลุมเครือของ "เพชร" (มรดกหลายรายการ) ได้อย่างไร
class A { public: void eat(){ cout<<"A";} }; class B: virtual public A { public: void eat(){ cout<<"B";} }; class C: virtual public A { public: void eat(){ cout<<"C";} }; class D: public B,C { public: void eat(){ cout<<"D";} }; int main(){ A *a = new D(); a->eat(); } ฉันเข้าใจปัญหาเพชรและส่วนข้างบนของรหัสไม่มีปัญหานั้น …

3
Objective-C หลายมรดก
ฉันมี 2 คลาสหนึ่งมี methodA และอีกคลาสรวม methodB ดังนั้นในคลาสใหม่ฉันต้องแทนที่ method methodA และ methodB ดังนั้นฉันจะบรรลุการสืบทอดหลายรายการในวัตถุประสงค์ C ได้อย่างไร ฉันสับสนเล็กน้อยกับไวยากรณ์

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