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

4
แทนที่เงื่อนไขด้วยความหลากหลายในวิธีที่เหมาะสม?
พิจารณาสองคลาสDogและCatทั้งสองสอดคล้องกับAnimalโปรโตคอล (ในแง่ของภาษาการเขียนโปรแกรม Swift นั่นคืออินเทอร์เฟซใน Java / C #) เรามีหน้าจอที่แสดงรายการสุนัขและแมวที่หลากหลาย มีInteractorคลาสที่จัดการตรรกะเบื้องหลัง ตอนนี้เราต้องการที่จะนำเสนอการแจ้งเตือนการยืนยันให้กับผู้ใช้เมื่อเขาต้องการที่จะลบแมว อย่างไรก็ตามสุนัขจะต้องถูกลบทันทีโดยไม่มีการแจ้งเตือนใด ๆ วิธีที่มีเงื่อนไขจะมีลักษณะเช่นนี้: func tryToDeleteModel(model: Animal) { if let model = model as? Cat { tellSceneToShowConfirmationAlert() } else if let model = model as? Dog { deleteModel(model: model) } } รหัสนี้จะถูก refactored ได้อย่างไร? เห็นได้ชัดว่ามันมีกลิ่น

4
แทนอินสแตนซ์ของ Java?
ดังนั้นฉันค่อนข้างใหม่ในการเขียนโปรแกรมในโลกแห่งความเป็นจริง (นอกโครงการวิชาการ) และได้เจอโพสต์มากมายบอกว่าการใช้instanceofเป็นสิ่งที่ไม่ดีที่จะใช้เพื่อกำหนดว่าวัตถุที่เฉพาะเจาะจงในชั้นเรียนคืออะไร สถานการณ์ของฉันคือว่าฉันมีสามคลาสคลาสผลิตภัณฑ์พื้นฐานที่หนึ่งขยายออกและอื่น ๆ ที่ขยายนั้น ทั้งหมดนี้เก็บไว้ในตารางเดียวกันในฐานข้อมูลและฉันมีรหัสบางอย่างที่จำเป็นต้องใช้วิธีการในการดึงข้อมูลออกจากพวกเขา การปฏิบัติที่ดีที่สุดในการหลีกเลี่ยงวิธีนี้คืออะไร? ฉันได้อ่านบางอย่างเกี่ยวกับ polymorphism แล้ว แต่ฉันไม่พบตัวอย่างใด ๆ ที่แก้ไขปัญหาที่ฉันมี พวกเขามักจะแทนที่วิธีการที่ฉันใช้ไม่ได้เพราะฉันต้องดึงสิ่งต่าง ๆ จากวัตถุต่าง ๆ มีวิธีที่ดีกว่าในการทำเช่นนี้หรือฉันติดอยู่กับการใช้instanceofหรือการสะท้อนบางอย่างเพื่อให้ได้ฟิลด์ที่เฉพาะเจาะจงกับวัตถุ

4
รูปแบบการออกแบบสำหรับพฤติกรรม polymorphic ในขณะที่อนุญาตให้แยกไลบรารี
สมมติว่าผมมีลำดับชั้นของชั้นเรียน:Item Rectangle, Circle, Triangleฉันต้องการที่จะสามารถวาดพวกเขาดังนั้นความเป็นไปได้ครั้งแรกของฉันคือการเพิ่มDraw()วิธีเสมือนในแต่ละ: class Item { public: virtual ~Item(); virtual void Draw() =0; }; อย่างไรก็ตามฉันต้องการแยกฟังก์ชั่นการวาดภาพเป็นห้องสมุดวาดแยกในขณะที่ห้องสมุด Core มีเพียงการแสดงขั้นพื้นฐาน มีความเป็นไปได้สองอย่างที่ฉันคิดได้: 1 - A DrawManagerที่รับรายการItems และต้องใช้dynamic_cast<>เพื่อระบุสิ่งที่ต้องทำ: class DrawManager { void draw(ItemList& items) { FOREACH(Item* item, items) { if (dynamic_cast<Rectangle*>(item)) { drawRectangle(); } else if (dynamic_cast<Circle*>(item)) { drawCircle(); } .... } } }; …

3
ส่วนประกอบสองอย่างที่เสนอฟังก์ชันการทำงานเดียวกันซึ่งเป็นไปตามความต้องการที่แตกต่างกัน
ฉันกำลังสร้างแอปพลิเคชันใน PHP โดยใช้ Zend Framework 1 และ Doctrine2 เป็นเลเยอร์ ORM ทุกอย่างเป็นไปด้วยดี ตอนนี้ฉันสังเกตเห็นว่าทั้ง ZF1 และ Doctrine2 มาพร้อมกับและใช้งานแคชของพวกเขาเอง ฉันได้ประเมินทั้งสองอย่างและในขณะที่แต่ละคนมีข้อดีและข้อเสียของตัวเองทั้งคู่ต่างก็โดดเด่นกว่าคนอื่นสำหรับความต้องการที่เรียบง่ายของฉัน ดูเหมือนว่าไลบรารีทั้งสองนั้นจะถูกเขียนลงบนอินเตอร์เฟสที่เกี่ยวข้องไม่ใช่การประยุกต์ใช้ เหตุผลที่ฉันรู้สึกว่านี่เป็นปัญหาคือในระหว่างการบูตแอปพลิเคชันของฉันฉันต้องกำหนดค่าแคชไดรเวอร์สองตัว - แต่ละอันมีไวยากรณ์ของตัวเอง ไม่ตรงกันถูกสร้างขึ้นอย่างง่ายดายด้วยวิธีนี้และรู้สึกไม่มีประสิทธิภาพในการตั้งค่าสองการเชื่อมต่อกับแบ็กเอนด์แคชเพราะสิ่งนี้ ฉันกำลังพยายามกำหนดว่าอะไรคือวิธีที่ดีที่สุดในการส่งต่อและยินดีรับข้อมูลเชิงลึกที่คุณสามารถเสนอได้ สิ่งที่ฉันคิดตอนนี้มีสี่ตัวเลือก: ไม่ทำอะไรเลยยอมรับว่ามีสองคลาสที่เสนอฟังก์ชันการแคช สร้างคลาส Facade เพื่อติดอินเทอร์เฟซของ Zend เข้ากับการใช้แคชของ Doctrine ตัวเลือก 2 วิธีอื่น ๆ - สร้าง Facade เพื่อแมปอินเทอร์เฟซของ Doctrine บนแบ็กเอนด์ Zend Framework ใช้หลายอินเทอร์เฟซการสืบทอดเพื่อสร้างอินเทอร์เฟซเดียวเพื่อปกครองทั้งหมดและอธิษฐานว่าไม่มีการซ้อนทับกัน (เช่น: หากทั้งคู่มีวิธี "บันทึก" พวกเขาจะต้องยอมรับพารามิเตอร์ในลำดับเดียวกันเนื่องจาก PHP ขาดความหลากหลายที่เหมาะสม) …

1
นัยกับอินเทอร์เฟซชัดเจน
ฉันคิดว่าฉันเข้าใจข้อ จำกัด ที่แท้จริงของการรวบรวมความแตกต่างของเวลาและความหลากหลายของเวลาทำงาน แต่อะไรคือความแตกต่างทางแนวคิดระหว่างอินเตอร์เฟสที่ชัดเจน (polymorphism แบบรันไทม์คือฟังก์ชันเสมือนและพอยน์เตอร์ / การอ้างอิง) และอินเทอร์เฟซโดยปริยาย (polymorphism เวลาคอมไพล์เช่น . ความคิดของฉันคือวัตถุสองชิ้นที่มีส่วนต่อประสานที่ชัดเจนเหมือนกันจะต้องเป็นวัตถุประเภทเดียวกัน (หรือมีบรรพบุรุษร่วมกัน) ในขณะที่วัตถุสองชิ้นที่มีส่วนต่อประสานแบบเดียวกันนั้นไม่จำเป็นต้องเป็นวัตถุชนิดเดียวกัน อินเทอร์เฟซที่พวกเขาทั้งสองเสนอสามารถมีฟังก์ชันการทำงานที่แตกต่างกันมาก ความคิดใด ๆ เกี่ยวกับเรื่องนี้? และหากวัตถุสองชิ้นมีอินเตอร์เฟสแบบนัยเดียวกันเหตุผลอะไร (ข้างๆประโยชน์ทางเทคนิคของการไม่ต้องใช้การส่งข้อมูลแบบไดนามิกที่มีตารางการค้นหาฟังก์ชั่นเสมือน ฯลฯ ) จะไม่มีวัตถุเหล่านี้สืบทอดมาจากวัตถุพื้นฐานที่ประกาศอินเตอร์เฟสนั้น ทำให้เป็นอินเทอร์เฟซที่ชัดเจนหรือไม่ อีกวิธีในการบอกว่า: คุณสามารถให้กรณีที่วัตถุสองอย่างที่เสนออินเทอร์เฟซแบบเดียวกัน (และสามารถใช้เป็นชนิดของคลาสเทมเพลตตัวอย่าง) ไม่ควรสืบทอดมาจากคลาสพื้นฐานที่ทำให้อินเทอร์เฟซนั้นชัดเจน? บางโพสต์ที่เกี่ยวข้อง: https://stackoverflow.com/a/7264550/635125 https://stackoverflow.com/a/7264689/635125 https://stackoverflow.com/a/8009872/635125 นี่คือตัวอย่างที่จะทำให้คำถามนี้เป็นรูปธรรมมากขึ้น: การเชื่อมต่อโดยนัย: class Class1 { public: void interfaceFunc(); void otherFunc1(); }; class Class2 { public: void interfaceFunc(); …
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.