Ich kämpfe mit einer Situation, in der ich immer wieder auftrete, aber ich bin mir nicht sicher, ob die Art, wie ich Dinge tue, falsch ist oder ob ich Dinge anders machen könnte.
Ein Beispiel:
Ich habe ein Windows-Formular, das eine DataGridView mit einigen privaten Methoden hat, um das Datagrid zu validieren und rechte Mausklicks auf dem Datagridview usw. zu interpretieren. Dieses Fenster ist im Wesentlichen eine "abstrakte" Klasse und wird niemals direkt instanziiert. p>
Ich erben dann von dieser Basisklasse und passen sie auf verschiedene Arten an (Mustermuster), z. Definieren Sie die Spalten der Datagridview und bestimmte Formatierungsmethoden, die für diese Spalten usw. spezifisch sind.
Wenn ich diese Klassen verwende, bilden die öffentlichen Methoden der Basisklasse meine Schnittstelle und ich kann den bestimmten Typ von datagridview, den ich will, instanziieren und ihn über die gemeinsame Schnittstelle manipulieren. Schön.
Das Problem:
Das Hauptproblem besteht darin, dass Sie eine Windows Form-Klasse eigentlich nicht als abstrakt deklarieren können, ohne dass der Visual Studio-Designer einen Wobbly wirft, da er diese abstrakten Klassen nicht instanziieren kann.
Einige Lösungen:
Im Moment "implementiere" ich diese Methoden in der Basisklasse, die ich überschreiben möchte:
%Vor%so zumindest, wenn ich vergessen habe, eine dieser Methoden zu überschreiben, die meine Schnittstelle bilden. Das scheint mir jedoch ziemlich unangenehm und ich mag es nicht wirklich.
Eine andere Lösung, mit der ich spielte, war, die Vererbung ganz zu beseitigen und eine Schnittstelle (z. B. IMyDataGrid) zu definieren und diese in jeder datagridview-Klasse (eine Art Strategiemuster) zu implementieren. Das Problem hier ist jedoch, dass Sie die Vorteile der Code-Wiederverwendung verlieren, dass die Vererbung Ihnen die Bedeutung gibt, dass Sie viele verschiedene Formulare erstellen, eine Datagrid-Ansicht auf sie löschen müssen - effektiv den gleichen Code kopieren und in jeden einfügen. Schlecht.
Gibt es einen besseren Weg, dies zu erreichen?
Je nach Ihren Anforderungen gibt es viele Möglichkeiten.
DataGridView
ab, die eine Schnittstelle für die benutzerdefinierte Logik implementieren virtual
-Methoden anstelle einer abstract
-Klasse Sie müssen eine Option auswählen, die Ihren Bedürfnissen am besten entspricht. Ohne die Domain und Details zu kennen, in denen Ihre Frage gestellt wird, können wir Ihnen keine hundertprozentig sichere Antwort geben.
Sehen Sie sich diese Methode an, um zu erfahren, wie Sie die beiden benötigten Attribute erstellen können.
Sie benötigen die folgende Attribut- und Typ-Deskriptorklasse (Code aus UrbanPotato)
%Vor%Weisen Sie sie Ihrem abstrakten Formular wie folgt zu:
%Vor%Erstellen Sie eine neue Klasse, die von Ihrer abstrakten Form erbt. Diese Klasse wird von Visual Studio installiert werden
%Vor%Das sollte funktionieren.
Ich habe das gleiche Problem.
Diese Seite kann Ihnen helfen, auch wenn es sich nur um eine Problemumgehung handelt: Vererbung eines Formulars aus einer abstrakten Klasse (und damit es funktioniert im Designer) .
Ich habe keine bessere Lösung gefunden, aber anscheinend nicht. In der Tat zwingt der Windows Forms Designer Sie, Ihr Klassendesign anzupassen.
Tags und Links .net winforms abstract-class abstract