2014-10-31 23 views
5

Ich verstehe, was statische Klassen und versiegelte Klassen sind, und ich verwende regelmäßig Erweiterungsmethoden, ich frage mich nur - weiß jemand warum statische Klassen in C# versiegelt sind?Warum sind statische Klassen versiegelt?

Ich habe MSDN und die C# -Sprachspezifikation angeschaut, aber es sagt nie wirklich warum sie sind versiegelt.

Warum sollten wir nicht in der Lage sein, statische Klassen zu erben und statische Elemente zu überschreiben usw.?

Edit:

Ich schätze Ihre Antworten, aber Sie sprechen immer noch darüber, was eine statische Klasse ist. Ich weiß, warum ich seine Methoden nicht außer Kraft setzen kann. Aber ich frage, warum haben sie es so gemacht?

Sind Vtables wirklich so teuer? Warum eine Sprache so entwerfen, dass statische Klassen buchstäblich statisch sind? Ist es nur für die Tradition? Gibt es einen anderen Vorteil, den ich nicht sehe?

(Ich habe das schleichenden Verdacht, ich grundsätzlich den Punkt der statischen Klassen Mißverständnis bin.)

+0

Sie können statische Elemente nicht überschreiben, auch wenn die Klasse nicht statisch ist. Sie können sie immer nur beschatten ... Warum nicht stattdessen ein Entwurfsmuster wie Singleton verwenden, in dem Sie die Elemente überschreiben (weil es sich um eine statische Instanz handelt, nicht um Klassen) oder um andere Entwurfsmuster? –

+0

@BrianMains Es ist kein Singleton, es ist ein Zeroton. Es gibt niemals irgendwelche Instanzen, sondern genau einen. – Servy

+1

@Servy Ich glaube Brian schlägt vor, dass das OP ein Singleton verwendet, nicht dass eine statische Klasse eins ist. – DavidG

Antwort

6

Sie nicht statische Klassen erben können, weil Sie keine statischen Elemente außer Kraft setzen können. Sie können statische Member nicht überschreiben, da das gesamte Konzept des Überschreibens von Membern vom virtuellen Dispatch für den Typ des impliziten Parameters abhängig ist und statische Member keinen impliziten Parameter zum Versenden haben.

+1

Könnten Sie "virtuellen Versand" näher erläutern? Ich könnte googeln, ohne unwissend zu sein, aber ich frage mich nur. – RadioSpace

+0

@RadioSpace Es ist ein ziemlich komplexes Thema. Googeln Sie es einfach, wenn Sie mehr wissen möchten. Es ist weit jenseits des Rahmens einer SO-Antwort. – Servy

+0

gut genug für mich. Vielen Dank. Ich suche meistens nach Begriffen, um zu googlen. – RadioSpace

4

Das Versiegeln einer Klasse bedeutet, dass Sie sie nicht als Superklasse verwenden können. Eine Klasse static macht sie als Basisklassen nutzlos, weil sie keine überschreibbaren Methoden haben können. Daher hat die Ableitung von einer statischen Klasse fraglichen Wert: Man könnte argumentieren, dass man geschützte Methoden von einer statischen Basis teilen kann, aber dann ist es eine "Einbahnstraße", weil abgeleitete Klassen die Funktionalität ihrer Basen nicht durch nützliche Überschreibungen verändern können .

Dies kocht den Nutzen von statischen Klassen auf einen Namespace-ähnlichen Halter von Methoden und ihre zugehörigen statischen Daten. Wenn solche Klassen andere statische Klassen erben würden, würde dies diesen Zweck weniger klar machen, während sie in Bezug auf Funktionalität oder Bequemlichkeit sehr wenig hinzufügen würde.