vs2017 Visual Studio: Entwerfen Sie eine UserControl-Klasse, die von einer abstrakten Basisklasse abgeleitet ist




vs2017 marketplace (4)

Die beste Lösung ist hier:

http://wonkitect.wordpress.com/2008/06/20/using-visual-studio-whidbey-to-design-abstract-forms/

Wenn Sie es jetzt verwenden, ist es elegant und umgeht das zugrundeliegende Problem, ohne Ihr schönes OOP-Design zu zerstören.

Ich möchte eine abstrakte Basisklasse für einige meiner benutzerdefinierten UserControl . Der Grund liegt auf der Hand: Sie teilen einige gemeinsame Eigenschaften und Methoden (eine grundlegende Implementierung einiger Elemente einer Schnittstelle) und ich möchte sie nur einmal implementieren.

Ich habe dies getan, indem ich meine abstrakte Basisklasse definiert habe:

public abstract class ViewBase : UserControl, ISomeInterface

Dann ging ich wie üblich mit dem Designer eine meiner Ansichten um:

public partial class SpecialView : UserControl //all OK

Bis hier ist alles in Ordnung. Jetzt ersetze ich die Ableitung meiner SpecialView Klasse durch die abstrakte Basisklasse:

public partial class SpecialView : ViewBase //disrupts the designer

Jetzt funktioniert der Designer in Visual Studio 2008 nicht mehr und besagt: The designer must create an instance of type 'ViewBase' but it cannot because the type is declared as abstract.

Wie kann ich das umgehen? Ich möchte einfach nicht den gleichen Code für alle diese Ansichten kopieren.

Info: Es gibt eine Frage mit virtuellen Methoden anstelle von abstrakten Klassen, aber es gibt keine passende Lösung für mich.


Anstatt die abstrakte Klasse zu verwenden, können Sie die Funktionen virtuell markieren und sie in den erbenden Klassen überschreiben


Versuchen Sie diese Lösung von Urban Potato , die für mich funktionierte, mit einem seltsamen Nebeneffekt , den ich nie wirklich erklärt hatte, und bekam nie einen guten Workaround. Vielleicht wirst du Glück haben und diesen Nebeneffekt nicht haben!


Man könnte argumentieren, dass es in Bezug auf die Designphilosophie keinen Sinn macht, mit einer abstrakten Kontrolle im Designer zu arbeiten. Eine abstrakte Klasse tendiert dazu, eine Art von Objekt zu modellieren, für das einfach zu wissen, dass es ein "X" ist, es nicht angemessen beschreibt - es gibt keinen abstrakten Vogel oder ein Auto, es ist immer eine bestimmte Art von Vogel oder Auto. Wenn Sie auf diese Weise ein benutzerdefiniertes Steuerelement im Designer anzeigen möchten, muss es sich um eine bestimmte Art von Steuerelement und nicht um ein abstraktes Steuerelement handeln. Was betrachten Sie sonst? Ich kann sehen, warum es nervig ist, aber ich kann auch sehen, warum der Designer auf diese Weise codiert wurde.







base