ในอดีตที่ผ่านมาฉันเคยใช้การสืบทอดเพื่อให้สามารถขยายแบบฟอร์ม Windows ในแอปพลิเคชันของฉันได้ ถ้าแบบฟอร์มทั้งหมดของฉันมีตัวควบคุมงานศิลปะและฟังก์ชันการทำงานร่วมกันฉันจะสร้างแบบฟอร์มพื้นฐานที่ใช้ตัวควบคุมและฟังก์ชันการทำงานทั่วไปแล้วอนุญาตให้ตัวควบคุมอื่นสืบทอดจากแบบฟอร์มพื้นฐานนั้น อย่างไรก็ตามฉันพบปัญหาเล็กน้อยเกี่ยวกับการออกแบบ
การควบคุมสามารถอยู่ในภาชนะหนึ่งครั้งเท่านั้นดังนั้นการควบคุมแบบคงที่ใด ๆ ที่คุณมีจะยุ่งยาก ตัวอย่างเช่นสมมติว่าคุณมีรูปแบบพื้นฐานที่เรียกว่า BaseForm ซึ่งมี TreeView ซึ่งคุณได้รับการป้องกันและคงที่เพื่อให้อินสแตนซ์อื่น ๆ (ที่ได้รับ) ของคลาสนี้ทั้งหมดสามารถแก้ไขและแสดง TreeView เดียวกันได้ สิ่งนี้จะไม่ทำงานสำหรับหลาย ๆ คลาสที่สืบทอดมาจาก BaseForm เนื่องจาก TreeView นั้นสามารถอยู่ในหนึ่งคอนเทนเนอร์ในแต่ละครั้งเท่านั้น มันน่าจะเป็นในรูปแบบสุดท้ายที่เริ่มต้น แม้ว่าทุกอินสแตนซ์สามารถแก้ไขการควบคุมได้ แต่จะแสดงในเวลาเดียวเท่านั้น แน่นอนว่ามีการแก้ไข แต่พวกมันน่าเกลียด (นี่ดูเหมือนจะเป็นการออกแบบที่แย่มากสำหรับฉันทำไมภาชนะบรรจุหลาย ๆ อันไม่สามารถเก็บพอยน์เตอร์ไปยังวัตถุเดียวกันได้อย่างไรก็ตามมันเป็นอย่างนั้น)
สถานะระหว่างฟอร์มนั่นคือปุ่มสถานะข้อความป้ายกำกับ ฯลฯ ฉันต้องใช้ตัวแปรโกลบอลสำหรับและรีเซ็ตสถานะบนโหลด
สิ่งนี้ไม่ได้รับการสนับสนุนโดยนักออกแบบของ Visual Studio เป็นอย่างดี
มีการออกแบบที่ดีกว่า แต่ยังคงไว้ซึ่งการบำรุงรักษาที่ใช้ง่ายหรือไม่? หรือรูปแบบการสืบทอดยังคงเป็นวิธีที่ดีที่สุด?
อัปเดต ฉันเปลี่ยนจากการดู MVC เป็น MVP เป็นรูปแบบการสังเกตการณ์เป็นรูปแบบกิจกรรม นี่คือสิ่งที่ฉันกำลังคิดอยู่ในขณะนี้โปรดวิจารณ์:
คลาส BaseForm ของฉันจะมีตัวควบคุมและกิจกรรมที่เชื่อมต่อกับตัวควบคุมเหล่านั้นเท่านั้น เหตุการณ์ทั้งหมดที่ต้องมีตรรกะเพื่อจัดการกับมันจะผ่านไปยังคลาส BaseFormPresenter ทันที คลาสนี้จะจัดการข้อมูลจาก UI ดำเนินการทางตรรกะใด ๆ แล้วอัปเดต BaseFormModel แบบจำลองจะเปิดเผยเหตุการณ์ซึ่งจะเกิดขึ้นเมื่อมีการเปลี่ยนแปลงสถานะไปยังคลาสของผู้นำเสนอซึ่งมันจะสมัครสมาชิก (หรือสังเกต) ไปที่ เมื่อผู้นำเสนอได้รับการแจ้งเตือนเหตุการณ์จะดำเนินการตามตรรกะใด ๆ จากนั้นผู้นำเสนอจะแก้ไขมุมมองตามนั้น
จะมีเพียงหนึ่งในแต่ละคลาสโมเดลในหน่วยความจำ แต่อาจมีหลายอินสแตนซ์ของ BaseForm และดังนั้น BaseFormPresenter สิ่งนี้จะแก้ปัญหาของฉันในการซิงโครไนซ์อินสแตนซ์ของ BaseForm กับโมเดลข้อมูลเดียวกัน
คำถาม:
เลเยอร์ใดที่ควรจัดเก็บสิ่งต่าง ๆ เช่นปุ่มกดสุดท้ายเพื่อให้ฉันสามารถเน้นไว้สำหรับผู้ใช้ (เช่นในเมนู CSS) ระหว่างฟอร์ม
โปรดวิจารณ์การออกแบบนี้ ขอบคุณสำหรับความช่วยเหลือของคุณ!