C # Alternative zu virtuellen statischen Methoden und statischen Unterklassen

8

Immer wenn ich Fragen RE oder ein ähnliches Thema statischer Vererbung lese, antworten die Antworten normalerweise, dass dies nicht unterstützt wird (wir wissen das), und der Grund wird angegeben, weil dies ein schlechtes Design ist und es wahrscheinlich ein besserer Weg, es zu tun. Ich würde gerne einen besseren Weg finden, es zu tun, also bin ich offen für alle Vorschläge - hier ist, was ich versuche zu tun.

Ich habe eine Klasse, die keine Instanzdaten hat. Alle Methoden sind statisch. Nennen wir das class BaseStatic . Ich möchte jetzt eine neue statische Klasse (na ja, natürlich, aber bleibe bei einer), die von dieser statischen Klasse erbt und einige neue statische Methoden hinzufügt, nennen wir das SubStatic .

Was ich möchte, dass Verbraucher schreiben können, ist:

%Vor%

und auch

%Vor%

Ich weiß, ich könnte auch schreiben:

%Vor%

explizit, aber dann müssen die Verbraucher wissen, welche Klasse welche Methoden implementiert. Ich kann dies nicht mit der Vererbung tun, weil ich eine statische Klasse nicht von einer anderen erben kann. Also, was ist ein besserer Weg, es zu tun?

Nun, ich weiß, dass ich diese Klassen als Instanzklassen haben kann, und ich kann alle Methoden als statisch definieren - das gibt mir das oben beschriebene Verhalten, führt aber zu anderen Problemen, nämlich:

  1. Wenn ich das tue: SubStatic.MethodFromBase() Der SubStatic statische Konstruktor wird nicht aufgerufen, weil die Methode in der übergeordneten statischen Klasse ausgeführt wird (der statische Konstruktor der Eltern wird aufgerufen)

  2. Wenn eine der statischen übergeordneten Methoden eine andere Methode aufrufen muss, die die Subklasse überschreiben kann, brauche ich eine virtuelle statische Methode in der Subklasse. Was ich weiß, kann ich nicht haben.

So schlechtes Design anscheinend - kann mir jemand helfen, es zu wiederholen? Ich weiß, dass ich die Instanzvererbung verwenden und die virtuellen Methoden richtig nutzen kann (ich hatte es so), aber Client-Code muss dann immer eine Instanz erstellen (oder ich nehme etwas Singleton an).

    
RBrowning99 22.10.2012, 05:16
quelle

2 Antworten

4

Dies könnte Ihrem Zweck dienen, obwohl ich sicherlich einige Ausnahmen behandeln und seine Implementierung mit einer Menge Dokumentation darüber begleiten würde, warum und wie es funktioniert.

Wenn der statische Konstruktor für Base einmal ausgeführt wird, werden alle derzeit in der Anwendungsdomäne geladenen Assemblys katalogisiert, wobei die Typen ausgewählt werden, die von Base abgeleitet werden. Iteratie über diese, führen wir die statischen Konstruktoren. Es ist jedoch erwähnenswert, dass dies nicht länger garantiert, dass der cctor für jede Implementierung genau einmal ausgeführt wird, und dass Logik jedem von ihnen hinzugefügt werden müsste, um diese Assertion wiederherzustellen. Darüber hinaus werden Typen, die nach dem cctor für Base geladen wurden, nicht durch Aufrufe von Methoden in Base

initialisiert

Um virtuelle Methoden zu simulieren, verwenden Sie das Schlüsselwort new , um die Basismethode auszublenden. Sie können die Basismethode aufrufen, indem Sie sie mit dem Namen der deklarierenden Klasse qualifizieren (wie in der Klasse B im Beispiel)

%Vor%

BEARBEITEN

Eine andere Option liegt im CRTP (oder CRGP im C # -Paradigma) oder seltsam wiederkehrenden Template (generischen) Parametermuster

%Vor%

Wenn wir in diesem Fall eine statische Methode für A aufrufen, nennen wir sie wirklich Base<A> , was sich von Base<B> oder Base unterscheidet, sodass wir können tatsächlich bestimmen wie die Methode aufgerufen wurde und den entsprechenden cctor ausführen.

    
mlorbetske 22.10.2012, 05:43
quelle
2

Sie können dies erreichen, indem Sie Generics verwenden. Zum Beispiel können Sie so etwas verwenden:

%Vor%     
Guillaume 22.10.2012 07:22
quelle

Tags und Links