คำถามติดแท็ก polymorphism

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

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

17
List <Dog> เป็นคลาสย่อยของ List <Animal> หรือไม่ ทำไม Java generics ถึงไม่ polymorphic โดยปริยาย?
ฉันสับสนเล็กน้อยเกี่ยวกับวิธีที่ Java generics จัดการกับการสืบทอด / polymorphism สมมติว่าลำดับชั้นดังต่อไปนี้ - สัตว์ (ผู้ปกครอง) สุนัข - แมว (เด็ก) doSomething(List&lt;Animal&gt; animals)ดังนั้นคิดว่าฉันมีวิธี ตามกฎของมรดกและ polymorphism ทั้งหมดผมจะคิดว่าList&lt;Dog&gt; เป็นList&lt;Animal&gt;และList&lt;Cat&gt; เป็นList&lt;Animal&gt; - และเพื่อคนใดคนหนึ่งอาจจะส่งผ่านไปยังวิธีการนี้ ไม่เช่นนั้น ถ้าผมต้องการที่จะบรรลุพฤติกรรมนี้ผมต้องบอกอย่างชัดเจนวิธีการที่จะยอมรับรายการ subclass ของสัตว์ใด ๆ doSomething(List&lt;? extends Animal&gt; animals)โดยกล่าวว่า ฉันเข้าใจว่านี่เป็นพฤติกรรมของ Java คำถามของฉันคือทำไม ? ทำไมความแตกต่างหลากหลายโดยปริยาย แต่เมื่อพูดถึงเรื่องทั่วไปมันจะต้องระบุ?


21
ความแตกต่างกับการเอาชนะการบรรทุกเกินพิกัด
ในแง่ของ Java เมื่อมีคนถามว่า: ความแตกต่างคืออะไร? จะบรรทุกเกินพิกัดหรือเอาชนะจะเป็นคำตอบที่ยอมรับได้หรือไม่? ฉันคิดว่ามันมีอะไรมากกว่านั้น หากคุณมีคลาสฐานนามธรรมที่กำหนดวิธีการที่ไม่มีการใช้งานและคุณกำหนดวิธีการนั้นในคลาสย่อยนั้นจะยังคงทับซ้อนกัน? ฉันคิดว่าการโหลดมากเกินไปไม่ใช่คำตอบที่ถูกต้องแน่นอน

4
เหตุใดฟังก์ชันที่แทนที่ในคลาสที่ได้รับจะซ่อนโอเวอร์โหลดอื่น ๆ ของคลาสพื้นฐาน
พิจารณารหัส: #include &lt;stdio.h&gt; class Base { public: virtual void gogo(int a){ printf(" Base :: gogo (int) \n"); }; virtual void gogo(int* a){ printf(" Base :: gogo (int*) \n"); }; }; class Derived : public Base{ public: virtual void gogo(int* a){ printf(" Derived :: gogo (int*) \n"); }; }; int main(){ …

17
อะไรคือความแตกต่างที่สำคัญระหว่าง Inheritance และ Polymorphism?
ฉันถูกนำเสนอด้วยคำถามนี้ในตอนท้ายของการสอบโมดูลเปิดจองวันนี้และพบว่าตัวเองหลงทาง ฉันอ่านHead first Javaและคำจำกัดความทั้งสองดูเหมือนจะเหมือนกันทุกประการ ฉันแค่สงสัยว่าความแตกต่างที่สำคัญสำหรับจิตใจของฉันคืออะไร ฉันรู้ว่ามีคำถามที่คล้ายกันจำนวนมาก แต่ไม่มีฉันเห็นซึ่งให้คำตอบที่ชัดเจน


11
ข้ามไปที่การใช้อินเตอร์เฟสใน Eclipse IDE
คุณรู้วิธีใน Eclipse การกดF3เมธอดจะนำคุณไปสู่การประกาศ? ฉันมีวิธีการที่เป็นส่วนหนึ่งของอินเทอร์เฟซ การคลิกที่F3นี่จะพาฉันไปที่อินเทอร์เฟซที่ประกาศไว้ตามธรรมชาติ เห็นได้ชัดว่ามีวัตถุที่ใช้อินเทอร์เฟซนี้และนี่คือที่ใช้วิธีการจริง ฉันต้องการเมื่อฉันกดF3เพื่อข้ามไปยังการใช้งานไม่ใช่การประกาศอินเตอร์เฟส ฉันรู้ว่าการใช้งานอาจไม่รู้จักในเวลารวบรวมดังนั้นมีวิธีที่ Eclipse จะแสดงคลาสทั้งหมดที่ใช้อินเตอร์เฟสเพื่อให้ฉันสามารถเลือกวิธีการนำไปใช้เพื่อดูได้หรือไม่? ตอนนี้เมื่อเกิดเหตุการณ์นี้ขึ้นฉันกำลังค้นหาสิ่งนี้ด้วยตนเองเพื่อค้นหาวิธีการที่นำมาใช้

5
ยกข้อยกเว้นด้วยประเภทและข้อความที่แตกต่างกันรักษาข้อมูลที่มีอยู่
ฉันกำลังเขียนโมดูลและต้องการมีลำดับชั้นข้อยกเว้นแบบรวมสำหรับข้อยกเว้นที่สามารถยกระดับได้ (เช่นการสืบทอดจากFooErrorคลาสนามธรรมสำหรับfooข้อยกเว้นเฉพาะทั้งหมดของโมดูล) สิ่งนี้ช่วยให้ผู้ใช้โมดูลสามารถตรวจจับข้อยกเว้นเฉพาะเหล่านั้นและจัดการพวกมันอย่างชัดเจนหากจำเป็น แต่มีข้อยกเว้นมากมายที่ยกมาจากโมดูลเนื่องจากข้อยกเว้นอื่น ๆ เช่นความล้มเหลวในบางงานเนื่องจาก OSError บนไฟล์ สิ่งที่ฉันต้องการคือ"ห่อ" ข้อยกเว้นที่จับได้ว่ามันมีประเภทและข้อความที่แตกต่างกันดังนั้นข้อมูลจะมีอยู่ในลำดับชั้นการเผยแพร่ต่อไปโดยสิ่งใดก็ตามที่จับข้อยกเว้น แต่ฉันไม่ต้องการสูญเสียชนิดข้อความและการติดตามสแต็กที่มีอยู่เดิม นั่นคือข้อมูลที่มีประโยชน์ทั้งหมดสำหรับคนที่พยายามแก้ไขปัญหา ตัวจัดการข้อยกเว้นระดับบนสุดไม่ดีนักเนื่องจากฉันพยายามตกแต่งข้อยกเว้นก่อนที่มันจะเพิ่มระดับสแต็คการเผยแพร่ต่อไปและตัวจัดการระดับบนสุดจะสายเกินไป นี่เป็นส่วนหนึ่งที่ได้รับการแก้ไขโดยการรับfooประเภทข้อยกเว้นเฉพาะของโมดูลจากประเภทที่มีอยู่ (เช่นclass FooPermissionError(OSError, FooError)) แต่นั่นไม่ได้ทำให้ง่ายต่อการห่ออินสแตนซ์ข้อยกเว้นที่มีอยู่ในรูปแบบใหม่หรือแก้ไขข้อความ ธPEP 3134 “ข้อยกเว้นผูกมัดและ tracebacks ฝังตัว” กล่าวถึงการเปลี่ยนแปลงที่ยอมรับในหลาม 3.0 สำหรับ“ผูกมัด” วัตถุข้อยกเว้นที่จะแสดงให้เห็นว่าข้อยกเว้นใหม่ถูกยกขึ้นในระหว่างการจัดการของข้อยกเว้นที่มีอยู่ สิ่งที่ฉันพยายามจะทำคือเกี่ยวข้อง: ฉันต้องการมันยังทำงานในรุ่น Python ก่อนหน้านี้และฉันไม่ต้องการสำหรับการผูกมัด แต่สำหรับ polymorphism เท่านั้น วิธีที่ถูกต้องในการทำเช่นนี้คืออะไร?

12
ใน Java ฉันจะเรียกวิธีการของคลาสพื้นฐานจากวิธีการเอาชนะในคลาสที่ได้รับมาได้อย่างไร
ฉันมีคลาส Java สองคลาส: B ซึ่งขยายคลาส A อื่นดังนี้: class A { public void myMethod() { /* ... */ } } class B extends A { public void myMethod() { /* Another code */ } } ผมอยากจะเรียกจากA.myMethod() B.myMethod()ฉันมาจากโลก C ++และฉันไม่รู้วิธีการทำสิ่งพื้นฐานใน Java


7
ความหลากหลายใน C ++
AFAIK: C ++ มีความแตกต่างกันสามประเภท ฟังก์ชันเสมือนจริง ชื่อฟังก์ชันมากเกินไป ตัวดำเนินการมากเกินไป นอกเหนือจากความหลากหลายสามประเภทข้างต้นแล้วยังมีความหลากหลายประเภทอื่น ๆ อีกด้วย: เวลาทำงาน เวลารวบรวม ความแตกต่างแบบเฉพาะกิจ พหุนามพาราเมตริก ฉันรู้ว่าความหลากหลายของรันไทม์สามารถทำได้โดยฟังก์ชันเสมือนจริง และความแตกต่างแบบคงที่สามารถทำได้โดยฟังก์ชันเทมเพลต แต่สำหรับอีกสองคน ความแตกต่างแบบเฉพาะกิจ polymorphism พาราเว็บไซต์กล่าวว่า , โพลีมอร์ฟิซึมเฉพาะกิจ: หากช่วงของประเภทจริงที่สามารถใช้ได้มี จำกัด และต้องระบุชุดค่าผสมทีละรายการก่อนใช้งานสิ่งนี้เรียกว่า ad-hoc polymorphism ความหลากหลายเชิงพาราเมตริก: หากเขียนโค้ดทั้งหมดโดยไม่ระบุประเภทใดประเภทหนึ่งดังนั้นจึงสามารถใช้งานได้อย่างโปร่งใสกับประเภทใหม่ ๆ จำนวนมากเรียกว่าพหุนามพาราเมตริก ฉันแทบไม่เข้าใจพวกเขาเลย :( ใครช่วยอธิบายทั้งสองอย่างด้วยตัวอย่างได้ไหม ฉันหวังว่าคำตอบสำหรับคำถามนี้จะเป็นประโยชน์สำหรับผู้ผ่านการคัดเลือกใหม่จากวิทยาลัยของพวกเขา

12
จะเรียก base.base.method () ได้อย่างไร?
// Cannot change source code class Base { public virtual void Say() { Console.WriteLine("Called from Base."); } } // Cannot change source code class Derived : Base { public override void Say() { Console.WriteLine("Called from Derived."); base.Say(); } } class SpecialDerived : Derived { public override void Say() { Console.WriteLine("Called …
127 c#  polymorphism 

5
วิธีเสมือนส่วนตัวใน C ++
ข้อดีของการสร้างเมธอดส่วนตัวเสมือนใน C ++ คืออะไร? ฉันสังเกตเห็นสิ่งนี้ในโครงการ C ++ โอเพ่นซอร์ส: class HTMLDocument : public Document, public CachedResourceClient { private: virtual bool childAllowed(Node*); virtual PassRefPtr&lt;Element&gt; createElement(const AtomicString&amp; tagName, ExceptionCode&amp;); };

10
เหตุใด 'ref' และ 'out' จึงไม่สนับสนุนความหลากหลาย
ดำเนินการดังต่อไปนี้: class A {} class B : A {} class C { C() { var b = new B(); Foo(b); Foo2(ref b); // &lt;= compile-time error: // "The 'ref' argument doesn't match the parameter type" } void Foo(A a) {} void Foo2(ref A a) {} } เหตุใดข้อผิดพลาดเวลาคอมไพล์ข้างต้นจึงเกิดขึ้น สิ่งนี้เกิดขึ้นกับทั้งสองrefและoutข้อโต้แย้ง

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