2009-08-01 10 views
2

Ich habe eine Reihe von verschiedenen Formen, die ich gerne eine Basis MustInherit Klasse für erstellen würde. Eine Funktion, die ich möchte, dass sie alle enthalten ist eine gemeinsame Funktion namens GetForms(). Ich weiß, dass Sie nicht eine gemeinsame Funktion erklären kann MustOverride so habe ich das folgende in meiner abstrakten Klasse:Ist diese ASP.NET-Verhaltenspraxis akzeptabel?

Public Shared Function GetForms() As List(Of OrderForm) 
    'to be overridden in child class' 
    Return Nothing 
End Function 

Und dieses in meinem Kind Klasse:

Public Overloads Shared Function GetForms() As List(Of OrderForm) 
    'do stuff' 
End Function 

führt dies zu Problemen auf der ganzen Linie oder ist dies eine akzeptable Problemumgehung? Es riecht daran, aber es wird erzwingen, dass alle meine Formulare eine gemeinsame GetForms-Funktion enthalten.

EDIT Ich weiß, dass, wenn dies mit Schnittstellen möglich wäre, würde ich eine verwenden, aber Sie können nicht freigegebene Funktionen in Schnittstellen deklarieren, und ich möchte sicherstellen, dass dies eine SHARED-Funktion ist.

+0

Was ist Ihr Verständnis von shared keyword? und warum glaubst du, du würdest es benutzen wollen? – shahkalpesh

+0

Bitte beachten Sie meinen Kommentar unter scottE's Beitrag – Jason

+0

Haben Sie jemals eine Lösung für Ihr Problem gefunden? –

Antwort

0

Ja, das riecht!

Sieht so aus, als ob Sie stattdessen eine Schnittstelle verwenden sollten.

ist hier ein vb.net Artikel: http://www.developer.com/lang/other/article.php/939411

+0

Sie können nicht freigegebene Funktionen in Schnittstellen – Jason

+0

deklarieren Es sieht so aus, als wolle er Klassen implementieren, um bestimmte funktional zu implementieren, was klingt wie ein guter Grund, eine Schnittstelle zu verwenden. – ScottE

+0

außer ich möchte es geteilt werden ... und Sie können eine Funktion nicht als SHARED mit einer Schnittstelle erklären ... – Jason

0

Warum sollte man einfach nicht erklären es als:

Public MustOverride Function GetForms() As List(Of OrderForm)? 
+0

weil ich es teilen muss ... – Jason

3

Dieser hat einen Geruch, weil es eine falsche Erwartung des Verhalten des Codes erzeugt .

Sie erwähnen, dass Ihr Grund dafür ist, dass 'es erzwingen wird, dass alle meine Formulare eine gemeinsame GetForms-Funktion' enthalten. Dies ist nur teilweise richtig. Ja, sie alle haben die GetForms Funktion, aber Sie sind nicht wirklich zwingen die abgeleiteten Klassen, um ihre eigene Version davon zu implementieren. Wenn Sie vergessen, die Funktion in einem von ihnen zu implementieren, rufen Sie die Basisversion auf, und Sie erhalten keine Warnung vom Compiler.

Das ist der Geruch: Er kann das Verhalten, das Sie wollen, nicht wirklich erzwingen, aber es erzeugt auf den ersten Blick einen Eindruck, dass es möglich ist. Dies führt in 6 Monaten zu Kopfschmerzen, wenn Sie einen neuen Formulartyp hinzufügen und die Konvention vergessen haben. Sie erhalten keine Warnung, dass etwas nicht stimmt, bis Sie während des Tests schlechte Ergebnisse erhalten.

Wenn Sie Verhalten erzwingen wollen, müssen Sie es mit Instanz-Mitgliedern tun; mit MustOverride (abstrakten) Funktionen oder einer Schnittstelle.

+0

Ja, ich habe mit dem Code herumgefummelt und erkannte, dass es dies nicht wirklich durchsetzt. Also, das einzige, was ich tun kann, ist nur daran zu erinnern, die Funktion 'GetForms()' in jedem Formular zu verwenden. Wunderbar. – Jason

+1

auf einem anderen Hinweis gibt es eine Möglichkeit, die Vererbung und das Überschreiben einer gemeinsamen Funktion zu erzwingen? Ich kann nicht herausfinden, wie, und jede Ressource, die ich mir angesehen habe, hat mir ohne eine Art Workaround gesagt ... – Jason

+0

Es gibt keinen Sprachmechanismus, der das erzwungene Überschreiben freigegebener Mitglieder zulässt. Die Problemumgehung besteht darin, Ihr Design zu überdenken, damit der Code, der mit den Formularen arbeitet, sich nicht darum kümmert, um welchen Typ es sich handelt oder um Hilfsfunktionen zu verwenden oder um Handler zu erstellen, die nach Bedarf mit jedem Formulartyp umgehen können. –

0

Statische Methoden werden nicht vererbt, daher ist die Erwartung eines Übersteuerns nicht etwas, das wir fördern möchten. Mit anderen Worten, ich denke, Sie könnten hier den falschen Baum bellen.

1

Sie können statische (Shared) Methoden wie diese haben, aber Sie können die Implementierung von ihnen nicht durchsetzen.

Jede statische Methode ist lokal zu ihrer Klasse, Sie können sie in einer untergeordneten Klasse nicht überladen oder abstrakt machen (MustInherit). Sie müssen eine Instanzmethode (nicht statisch) verwenden, um die gewünschten objektorientierten Aspekte zu erhalten.

Verwandte Themen