W przeszłości korzystałem z dziedziczenia, aby umożliwić rozszerzenie formularzy Windows w mojej aplikacji. Gdyby wszystkie moje formularze miały wspólne elementy sterujące, kompozycję i funkcje, utworzyłbym formularz podstawowy implementujący wspólne elementy sterujące i funkcje, a następnie pozwalałem innym elementom sterującym na dziedziczenie z tego formularza podstawowego. Jednak natrafiłem na kilka problemów z tym projektem.
Kontrole mogą znajdować się tylko w jednym pojemniku na raz, więc wszelkie statyczne kontrole będą trudne. Na przykład: Załóżmy, że masz podstawową formę o nazwie BaseForm, która zawiera TreeView, który tworzysz chroniony i statyczny, aby wszystkie inne (pochodne) instancje tej klasy mogły modyfikować i wyświetlać ten sam TreeView. Nie działałoby to dla wielu klas dziedziczących z BaseForm, ponieważ TreeView może znajdować się tylko w jednym kontenerze na raz. Prawdopodobnie byłby w ostatniej zainicjowanej formie. Chociaż każda instancja może edytować kontrolkę, będzie wyświetlana tylko w jednym w danym momencie. Oczywiście istnieją obejścia, ale wszystkie są brzydkie. (Wydaje mi się, że to naprawdę zły projekt. Dlaczego wiele kontenerów nie może przechowywać wskaźników do tego samego obiektu? W każdym razie jest to, co to jest.)
Stan między formularzami, to znaczy stany przycisków, tekst etykiety itp., Muszę użyć zmiennych globalnych i zresetować stany na obciążeniu.
To nie jest tak naprawdę wspierane przez projektanta Visual Studio.
Czy jest lepszy, ale wciąż łatwy w utrzymaniu projekt? A może dziedziczenie formy jest nadal najlepszym podejściem?
Aktualizacja Przeszedłem od patrzenia na MVC na MVP na Wzorzec Obserwatora na Wzorzec Wydarzenia. Oto, o czym teraz myślę, proszę o krytykę:
Moja klasa BaseForm będzie zawierać tylko formanty i zdarzenia powiązane z tymi formantami. Wszystkie zdarzenia, które wymagają jakiejkolwiek logiki, aby je obsłużyć, zostaną natychmiast przekazane do klasy BaseFormPresenter. Ta klasa będzie obsługiwać dane z interfejsu użytkownika, wykonywać wszelkie operacje logiczne, a następnie aktualizować model BaseFormModel. Model ujawni zdarzenia, które będą wyzwalane po zmianach stanu, klasie Presenter, której będzie subskrybować (lub obserwować). Gdy Prezenter otrzyma powiadomienie o zdarzeniu, wykona dowolną logikę, a następnie Prezenter odpowiednio zmodyfikuje Widok.
W pamięci będzie tylko jedna klasa modeli, ale potencjalnie może istnieć wiele wystąpień BaseForm, a zatem BaseFormPresenter. To rozwiązałoby mój problem synchronizacji każdej instancji BaseForm z tym samym modelem danych.
Pytania:
Która warstwa powinna przechowywać takie rzeczy, jak ostatni naciśnięty przycisk, aby mógł być podświetlony dla użytkownika (jak w menu CSS) między formularzami?
Krytykuj ten projekt. Dzięki za pomoc!