Visual Studio Formular-Designer mit von abstrakten Klassen abgeleiteten Formularen verwenden

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.

Einen Kommentar hinterlassen

Ihre E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *

*

Sie können folgende HTML-Tags benutzen: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>