Für ein aktuelles Projekt wollte ich eine abstrakte Formular-Basisklasse erstellen. Dadurch kann einiges an allgemeiner Funktionalität von allen Formularen geerbt und Schnittstellenmethoden können definiert werden.
Das Ergebnis war jedoch folgende Fehlermeldung, sobald ich versuchte eine meiner abgeleiteten Formularklassen in dem Formular-Designer des Visual Studios zu öffnen:
Der Designer kann keine Instanz des Typs <Typname> erstellen, da dieser als abstrakt deklariert ist.
Daraufhin suchte ich eine Lösung im Internet und es scheint als wäre ich nicht der Einzige, der die Idee hatte einige Formularklassen von einer abstrakten Basisklasse abzuleiten. Um das Problem zu lösen, erstellte ich eine Dummy-Implementierung von meiner abstrakten Basisklasse und leitete die Formularklassen von dieser Dummy-Implementierung ab. Dadurch konnten die Formularklassen wieder im Visual Studio Formular-Designer angezeigt werden.
In C# sehen die Klassen nun so aus:
public abstract partial class BaseForm : Form { // Methoden der abstrakten Basisklasse... } #if DEBUG public class BaseFormImpl : BaseForm { // Dummy-Implementierung der abstrakten BaseForm-Klasse. } #endif #if DEBUG public partial class RealForm : BaseFormImpl #else public partial class RealForm : BaseForm #endif { // Eins der Formular, das das Basis-Formular erweitert. }
Und für Entwickler mit VB .NET sieht es so aus:
Public MustInherit Partial Class BaseForm Inherits Form ' Methoden der abstrakten Basisklasse... End Class #if DEBUG Public Class BaseFormImpl Inherits BaseForm ' Dummy-Implementierung der abstrakten BaseForm-Klasse. End Class #endif Public Partial Class RealForm #if DEBUG Inherits BaseFormImpl #else Inherits BaseForm #endif ' Eins der Formular, das das Basis-Formular erweitert. End Class
Nun sind Ihnen sicherlich die Compiler-Anweisungen aufgefallen: Natürlich wären diese nicht erforderlich, damit die Formulare wieder korrekt im Formular-Designer funktionieren. Jedoch mag ich keinen unnötigen Quelltext im veröffentlichten Produkt (und diese Dummy-Implementierung der abstrakten BaseForm-Klasse ist wirklich nutzlos). Daher habe ich diese bedingten Compiler-Anweisungen verwendet, um sicherzustellen, dass diese Dummy-Klasse wirklich nur im Debug-Modus verwendet wird.
Sind Sie selbst auch bereits einmal auf dieses Problem gestoßen?
Der Artikel ist auch in English verfügbar.