Kann ich Unterklassen zwingen, eine Methode zu überschreiben, ohne sie abstrakt zu machen?

8

Ich habe eine Klasse mit einigen abstrakten Methoden, aber ich möchte in der Lage sein, eine Unterklasse dieser Klasse im Designer zu bearbeiten. Der Designer kann die Unterklasse jedoch nur bearbeiten, wenn sie eine Instanz der übergeordneten Klasse erstellen kann. Mein Plan ist also, die abstrakten Methoden durch Stubs zu ersetzen und sie als virtuell zu markieren - aber wenn ich dann eine andere Unterklasse mache, bekomme ich keinen Kompilierfehler, wenn ich vergesse, sie zu implementieren.

Gibt es eine Möglichkeit, die Methoden so zu markieren, dass sie von Unterklassen implementiert werden müssen, ohne sie als abstrakt zu kennzeichnen?

    
Simon 27.10.2008, 09:28
quelle

7 Antworten

9

Nun, Sie könnten etwas wirklich unordentlichen Code mit #if machen - d. h. in DEBUG ist es virtuell (für den Designer), aber in RELEASE ist es abstrakt. Ein wahrer Schmerz, aber zu erhalten.

Aber anders als das: im Grunde, nein. Wenn Sie Designerunterstützung wünschen, kann es nicht abstrakt sein, Sie bleiben also bei "virtual" (vermutlich mit der Basismethode, die NotImplementedException wirft).

Natürlich werden Ihre Komponententests prüfen, ob die Methoden implementiert wurden, ja? ;-p

Eigentlich wäre es wahrscheinlich ziemlich einfach, über Generika zu testen - also eine generische Testmethode der Form:

%Vor%     
Marc Gravell 27.10.2008, 09:32
quelle
5

Sie können den Verweis auf das Implementierungs-Idiom in Ihrer Klasse verwenden.

%Vor%

DesignerHappy gibt nur die gewünschte Schnittstelle frei, leitet jedoch alle Aufrufe an das Implementierungsobjekt weiter. Sie erweitern das Verhalten, indem Sie ADesignerHappyImp unterordnen, wodurch Sie gezwungen werden, alle abstrakten Member zu implementieren.

Sie können eine Standardimplementierung von ADesignerHappyImp bereitstellen, mit der DesignerHappy standardmäßig initialisiert wird und eine Eigenschaft verfügbar macht, mit der Sie die Implementierung ändern können.

    
Curro 27.10.2008 16:01
quelle
1

Beachten Sie, dass "DesignMode" nicht im Konstruktor festgelegt ist. Es wird festgelegt, nachdem VS die InitializeComponents () -Methode analysiert hat.

    
Jim 20.11.2008 16:36
quelle
0

Ich weiß es nicht ganz, was Sie wollen, aber Sie könnten alle Ihre Stubs in der Basisklasse werfen die NotImplementedException. Wenn dann eine Ihrer Unterklassen sie nicht überschrieben hat, erhalten Sie eine Laufzeitausnahme, wenn die Methode in der Basisklasse aufgerufen wird.

    
Simon Keep 27.10.2008 10:15
quelle
0

Die Component-Klasse enthält eine boolesche Eigenschaft namens "DesignMode", die sehr nützlich ist, wenn Sie möchten, dass sich Ihr Code im Designer anders verhält als zur Laufzeit. Kann in diesem Fall von Nutzen sein.

    
Brent Rockwood 27.10.2008 15:20
quelle
0

Als allgemeine Regel, wenn es in einer Sprache keinen Weg gibt, etwas zu tun, was im Allgemeinen bedeutet, dass es einen guten konzeptionellen Grund gibt, es nicht zu tun.

Manchmal ist das die Schuld der Sprachdesigner - aber nicht oft. Normalerweise finde ich, dass sie mehr über Sprachdesign wissen als ich ;-)

In diesem Fall möchten Sie, dass eine nicht überschriebene virtuelle Methode eine Kompilierungszeit-Ausnahme (eher und eine Laufzeit-Ausnahme) auslöst. Grundsätzlich eine abstrakte Methode dann.

Wenn virtuelle Methoden sich wie abstrakte verhalten, wird das eine verwirrende Welt für Sie schaffen.

Andererseits ist das VS-Plug-In-Design oft nicht ganz auf dem gleichen Niveau (das ist ein wenig unfair, aber es wird sicherlich weniger streng gehandhabt als in der Phase des Sprachdesigns - und das zu Recht). Einige VS-Tools, wie der Klassen-Designer und die aktuellen WPF-Editoren, sind zwar nette Ideen, aber noch nicht wirklich vollständig.

In dem Fall, dass Sie beschreiben, denke ich, dass Sie ein Argument haben, den Klassen-Designer nicht zu verwenden, kein Argument, um Ihren Code zu hacken.

Irgendwann (vielleicht im nächsten VS) werden sie aufräumen, wie der Klassen-Designer mit abstrakten Klassen umgeht, und dann haben Sie einen Hack, ohne zu wissen, warum er so codiert wurde.

Es sollte immer der letzte Ausweg sein, um Ihren Code zu hacken, damit er zum Designer passt, und wenn Sie versuchen, Hacks minimal zu halten. Ich finde, dass es in der Regel besser ist, einen übersichtlichen, lesbaren Code zu haben, der schnell über byzantinischen Code funktioniert, der in den aktuellen, kaputten Werkzeugen funktioniert.

    
Keith 27.10.2008 17:11
quelle
0

Um ms als Beispiel zu verwenden ...

Microsoft tut dies mit den Benutzersteuervorlagen in silverlight. #if ist vollkommen akzeptabel und es ist zweifelhaft, ob die Werkzeuge in absehbarer Zeit funktionieren werden. IMHO

    
Roger 19.10.2011 02:26
quelle