Trước đây, tôi đã sử dụng tính kế thừa để cho phép mở rộng các biểu mẫu Windows trong ứng dụng của mình. Nếu tất cả các biểu mẫu của tôi sẽ có các điều khiển, tác phẩm nghệ thuật và chức năng chung, tôi sẽ tạo một biểu mẫu cơ sở thực hiện các điều khiển và chức năng chung và sau đó cho phép các điều khiển khác kế thừa từ biểu mẫu cơ sở đó. Tuy nhiên, tôi đã gặp phải một vài vấn đề với thiết kế đó.
Điều khiển chỉ có thể ở trong một container tại một thời điểm, do đó, bất kỳ điều khiển tĩnh nào bạn có sẽ rất khó khăn. Ví dụ: Giả sử bạn có một biểu mẫu cơ sở có tên BaseForm chứa TreeView mà bạn thực hiện được bảo vệ và tĩnh để tất cả các phiên bản (dẫn xuất) khác của lớp này có thể sửa đổi và hiển thị cùng một TreeView. Điều này sẽ không hoạt động đối với nhiều lớp kế thừa từ BaseForm, bởi vì TreeView chỉ có thể ở trong một container tại một thời điểm. Nó có thể sẽ ở dạng cuối cùng được khởi tạo. Mặc dù mọi phiên bản đều có thể chỉnh sửa điều khiển, nhưng nó sẽ chỉ hiển thị trong một tại một thời điểm nhất định. Tất nhiên, có những công việc xung quanh, nhưng tất cả chúng đều xấu xí. (Đây có vẻ là một thiết kế thực sự tồi tệ đối với tôi. Tại sao nhiều container không lưu trữ con trỏ vào cùng một đối tượng? Dù sao đi nữa, đó là những gì nó là.)
Trạng thái giữa các biểu mẫu, nghĩa là trạng thái nút, văn bản nhãn, v.v., tôi phải sử dụng các biến toàn cục cho và đặt lại trạng thái trên Tải.
Điều này thực sự không được hỗ trợ bởi nhà thiết kế của Visual Studio.
Có một thiết kế tốt hơn, nhưng vẫn dễ dàng bảo trì để sử dụng? Hoặc thừa kế hình thức vẫn là cách tiếp cận tốt nhất?
Cập nhật Tôi đã chuyển từ xem MVC sang MVP sang Mẫu quan sát đến Mẫu sự kiện. Đây là những gì tôi đang nghĩ cho lúc này, xin hãy phê bình:
Lớp BaseForm của tôi sẽ chỉ chứa các điều khiển và các sự kiện được kết nối với các điều khiển đó. Tất cả các sự kiện cần bất kỳ loại logic nào để xử lý chúng sẽ chuyển ngay đến lớp BaseFormPresenter. Lớp này sẽ xử lý dữ liệu từ UI, thực hiện bất kỳ hoạt động logic nào và sau đó cập nhật BaseFormModel. Mô hình sẽ hiển thị các sự kiện, sẽ kích hoạt các thay đổi trạng thái, đến lớp Người trình bày, mà nó sẽ đăng ký (hoặc quan sát). Khi Người thuyết trình nhận được thông báo sự kiện, nó sẽ thực hiện bất kỳ logic nào và sau đó Người thuyết trình sẽ sửa đổi Chế độ xem cho phù hợp.
Sẽ chỉ có một trong mỗi lớp Model trong bộ nhớ, nhưng có khả năng có thể có nhiều phiên bản của BaseForm và do đó là BaseFormPresenter. Điều này sẽ giải quyết vấn đề của tôi về việc đồng bộ hóa từng phiên bản của BaseForm với cùng một mô hình dữ liệu.
Câu hỏi:
Lớp nào nên lưu trữ nội dung như, nút nhấn cuối cùng, để tôi có thể giữ nó được tô sáng cho người dùng (như trong menu CSS) giữa các biểu mẫu?
Hãy chỉ trích thiết kế này. Cảm ơn bạn đã giúp đỡ!