In der Vergangenheit habe ich Vererbung verwendet, um die Erweiterung von Windows-Formularen in meiner Anwendung zu ermöglichen. Wenn alle meine Formulare über gemeinsame Steuerelemente, Grafiken und Funktionen verfügen würden, würde ich ein Basisformular erstellen, das die gemeinsamen Steuerelemente und Funktionen implementiert, und dann zulassen, dass andere Steuerelemente von diesem Basisformular erben. Ich habe jedoch ein paar Probleme mit diesem Design gestoßen.
Steuerelemente können sich jeweils nur in einem Container befinden, daher sind statische Steuerelemente schwierig. Beispiel: Angenommen, Sie hatten ein Basisformular namens BaseForm, das eine TreeView enthielt, die Sie geschützt und statisch machen, damit alle anderen (abgeleiteten) Instanzen dieser Klasse dieselbe TreeView ändern und anzeigen können. Dies funktioniert nicht für mehrere Klassen, die von BaseForm erben, da sich TreeView jeweils nur in einem Container befinden kann. Es wäre wahrscheinlich auf dem letzten Formular initialisiert. Obwohl jede Instanz das Steuerelement bearbeiten konnte, wurde es jeweils nur in einer Instanz angezeigt. Natürlich gibt es Workarounds, aber sie sind alle hässlich. (Dies scheint mir ein wirklich schlechtes Design zu sein. Warum können nicht mehrere Container Zeiger auf dasselbe Objekt speichern? Wie auch immer, es ist, was es ist.)
Status zwischen Formularen, dh Schaltflächenstatus, Bezeichnungstext usw. Ich muss globale Variablen für den Status beim Laden verwenden und ihn zurücksetzen.
Dies wird vom Visual Studio-Designer nicht sehr gut unterstützt.
Gibt es ein besseres und dennoch leicht zu wartendes Design? Oder ist Formularvererbung immer noch der beste Ansatz?
Update Ich wechselte von MVC zu MVP zum Observer-Pattern zum Event-Pattern. Hier ist, was ich im Moment denke, bitte Kritik:
Meine BaseForm-Klasse enthält nur die Steuerelemente und Ereignisse, die mit diesen Steuerelementen verbunden sind. Alle Ereignisse, für deren Verarbeitung eine beliebige Logik erforderlich ist, werden sofort an die BaseFormPresenter-Klasse übergeben. Diese Klasse verarbeitet die Daten von der Benutzeroberfläche, führt alle logischen Operationen aus und aktualisiert dann das BaseFormModel. Das Modell stellt Ereignisse, die bei Statusänderungen ausgelöst werden, der Presenter-Klasse zur Verfügung, die es abonniert (oder beobachtet). Wenn der Präsentator die Ereignisbenachrichtigung erhält, führt er eine beliebige Logik aus, und der Präsentator ändert die Ansicht entsprechend.
Es gibt nur eine von jeder Model-Klasse im Speicher, aber möglicherweise gibt es viele Instanzen der BaseForm und daher des BaseFormPresenter. Dies würde mein Problem der Synchronisierung jeder Instanz von BaseForm mit demselben Datenmodell lösen.
Fragen:
Auf welcher Ebene sollten Inhalte wie die zuletzt gedrückte Schaltfläche gespeichert werden, damit ich sie für den Benutzer (wie in einem CSS-Menü) zwischen Formularen hervorheben kann?
Bitte kritisieren Sie diesen Entwurf. Danke für Ihre Hilfe!