Statische Klassen können nicht instanziiert werden, daher hat sie keine Instanz. Nicht-statische Member benötigen eine Instanz ihrer Klasse für den Zugriff. Da die statische Klasse keine Instanz haben kann, können Sie nicht auf die nicht statischen Member zugreifen, falls solche vorhanden sind.
Daher können statische Klassen nur statische Elemente haben
Es ist keine Designentscheidung, sondern eine logische Entscheidung. Am einfachsten beginnen Sie mit den relevanten Definitionen der Konzepte:
Eine statische Klasse kann nicht instanziiert werden. Das bedeutet, dass Sie keine Objekte vom Typ dieser Klasse erstellen können.
Nicht statische Member sind an eine bestimmte Instanz einer Klasse gebunden. Sie enthalten Daten, die ausschließlich mit einem einzelnen Objekt dieses Klassentyps verknüpft sind.
Wenn also eine statische Klasse nicht statische Member enthält, können Sie niemals auf diese Daten zugreifen oder diese Methode aufrufen, da Sie niemals ein Objekt des Typs dieser statischen Klasse instanziieren können. Stattdessen müssen Sie alle statischen Elemente haben, die direkt von einer statischen Instanz der Klasse aufgerufen werden können.
Sie können jedoch nicht statische Klassen mit statischen Elementen haben. Auf diese Weise können Sie auf die Daten zugreifen oder die Methoden aufrufen, die als statische Member verfügbar gemacht werden, ohne ein Objekt dieser Klasse instanziieren. Sie könnten jedoch auch ein Objekt des Typs dieser Klasse instanziieren und auf nicht statische Member (oder Instanzen) zugreifen. Zum Beispiel, wenn Sie eine Klasse Circle
hätten, könnten Sie statische Mitglieder wie eine CalculateArea
-Funktion und ein PI
-Feld haben. Diese Mitglieder sind im allgemeinen für alle Kreise anwendbar, nur weil sie Kreise sind. Sie können jedoch auch nicht statische Member verwenden, die bestimmten Instanzen dieser Klasse zugeordnet sind, da sie spezifische Kreisobjekte beschreiben. Dies können die Felder Diameter
und Circumference
sein. Sie könnten auch nicht statische Funktionen haben, die die Fläche des Kreises berechnen, wenn Sie die Daten in den nicht statischen Feldern für diese bestimmte Instanz angeben.
Eine statische Klasse kann nicht instanziiert werden. Nicht-statische Mitglieder können daher niemals aufgerufen werden.
Wenn Sie statische Elemente mischen und abgleichen möchten, machen Sie die Klasse nicht statisch.
Wenn Sie ein nicht statisches Element in eine statische Klasse einfügen, handelt es sich nicht um eine statische Klasse. (Sie können eine statische Klasse nicht instanziieren - um nicht statische Member zu haben, müssten Sie in der Lage sein, Instanzen der Klasse zu erstellen, auf der diese Member aufgerufen werden sollen, was sie zu einer regulären Klasse machen würde)
Um es anders zu betrachten, indem Sie eine Klasse als statisch markieren, fragen Sie absichtlich, dass der Compiler Ihnen nicht erlaubt, nicht-statische Methoden in diese Klasse aufzunehmen - das ist eine Designentscheidung, die Sie getroffen haben, und der Compiler hilft zu überprüfen, dass Sie Ihrem eigenen Design folgen.
Ich bin nicht sicher, ob das verwandt ist, aber (zumindest in c # .net 4.0) eine statische Klasse nicht-statische Klassendefinitionen enthalten kann, die nicht-statische Member enthalten. Es scheint also, dass Sie einer statischen Klasse nicht statische Member hinzufügen können, da ein geschachtelter Typ als member
Beispiel:
%Vor%Wie Sie sehen können, verfügt die statische Klasse MyClass über eine nicht statische Klassendefinition Typ1, die instanziert werden muss, damit sie verwendet werden kann. Während die statische Funktion staticFunc in MyClass keine Instanz benötigt, auf die zugegriffen werden soll.
%Vor%Tags und Links class .net oop static class-design