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:
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)
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).
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
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)
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.
Tags und Links c# inheritance virtual static