Weder ist instanziierbar. Was sind die Unterschiede und in welchen Situationen könnten Sie das eine oder das andere benutzen?Was ist der Unterschied zwischen einer abstrakten und einer statischen Klasse?
Antwort
static
zeigt an, dass die Klasse nur statische Member haben kann und Sie keine Instanz davon erstellen können. Dies wird für zustandslose Funktionalität verwendet (z. B. ein Typ, der nur Erweiterungsmethoden oder Hilfsmethoden definiert). Sie können auch ein Mitglied static
für eine nicht statische Klasse deklarieren. Auf diese Weise können Sie Funktionen an einen Typ anhängen, ohne ihn instanziieren zu müssen.
Here's more detail on using static members and classes.
abstract
s definieren die grundlegende Struktur und Funktionalität, die von allen Derivatarten verwendet werden, können aber nicht für sich selbst verwendet werden. Denken Sie an sie als, ich denke, ein blauer Druck und ein Vertrag. Dies ist ein Kernkonzept für OOP.
Eine statische Klasse in C# ist eine versiegelte abstrakte Klasse –
Abstrakte Klassen werden indirekt über abgeleitete Klassen instanziiert. Sie stellen ein gemeinsames Verhalten und einen Instanzzustand bereit, signalisieren jedoch, dass mehr benötigt wird, und müssen von abgeleiteten konkreten Klassen bereitgestellt werden. Beispiel: Transform
könnte eine abstrakte Klasse sein: Sie deklariert eine allgemeine Methode Apply(Shape)
, aber keine Implementierung dieser Methode. Von Beton abgeleitete Klassen wie Rotation
oder implementieren diese Methode, und diese Klassen können instanziiert werden.
Statische Klassen können nicht instanziiert werden, und jeder Status ist auf Klassenebene und nicht auf Instanzenebene. Sie werden normalerweise verwendet, um Hilfsmethoden zu definieren, wenn den Methoden kein Status zugeordnet ist. Transform
konnte keine statische Klasse sein, da die konkret abgeleiteten Klassen pro Instanzenstatus benötigt werden (z. B. Rotation
benötigt eine pro Instanz Angle
, da verschiedene Rotation
Transformationen unter verschiedenen Winkeln sein können).
Hier eine kurze Zusammenfassung ist:
- Eine statische Klasse nur
static
Mitglieder (es ist nur ein Container für Methoden, die nicht logisch gehören zu einer Instanz von jeder Standard-Klasse) - Einem abstrakten enthalten Klasse kann alle gängigen Arten von Elementen (statisch, abstrakt und auch Instanz) cotnain
der wesentliche Unterschied ist, dass man von einer abstract
Klasse erben können, aber Sie können von einer static
Klasse nicht erben. Technisch gesehen hat die .NET-Laufzeit keine Ahnung von static
Klassen, also erfüllt der C# -Compiler sie als Klassen, die sowohl abstract
als auch sealed
sind (was bedeutet, dass Sie nicht von ihnen erben können).
So static
Klassen sind abstract
Klassen, die auch sealed
sind (obwohl dies nicht der übliche Weg ist, das Problem zu suchen, wenn Sie C# Programmierer) und enthalten nur static
Mitglieder (die von der C# Compiler erzwungen wird).
Abstrakte Klassen sollen als Basisklassen verwendet werden; Sie können keine direkten Instanzen haben. Stattdessen müssen Sie Unterklassen ableiten, die das bereitstellen, was in der abstrakten Basisklasse (normalerweise absichtlich) weggelassen wurde.
Beispiel: Sie haben eine komplexe Anwendung, in der sich Benutzer anmelden können.Verschiedene Authentifizierungsmechanismen sollten verwendet werden, zB LDAP, NTLM, Sie nennen es. Eine Möglichkeit, einen "Benutzer" oder "Principal" in einem solchen Kontext zu modellieren, besteht darin, das, was in all diesen Mechanismen üblich ist, in einer abstrakten Basisklasse zu sammeln und "Lücken" (abstrakte Methoden) zu hinterlassen, in die die tatsächlichen Implementierungen gelangen spielen:
abstract class Authenticator {
protected Dictionary<string,User> userCache;
...
public User LoadUser(string name) {
User user;
if(userCache.TryGet(name, out user)) return user;
else {
user = LoadFromStore(name);
userCache.Add(name, user);
return user;
}
}
protected abstract User LoadFromStore(string name);
}
Hier Caching von Benutzern ist ein gemeinsames Anliegen, in dem Basisfall modelliert, während die eigentliche retreival links ist für eine Unterklasse zu liefern.
Statische Klassen sind eine ganz andere Sache. Sie sind im Wesentlichen ein Ort, um Ihre Utility-Funktionen zu halten:
static class StrUtil {
public static string TrimWhitespace(string str) {
...
}
}
von ihnen denken, als eine Art von speziellen Namensraum, die nur statische Elemente enthalten kann. Im Grunde ein Ort, um Funktionen zu platzieren.
Eine abstrakte Klasse soll als Basis für eine Klassenvererbungshierarchie verwendet werden. Eine statische Klasse kann nicht die Basis einer Klassenvererbungshierarchie sein.
Eine statische Klasse ist für Singleton-Status oder zustandslose Funktionalität vorgesehen. Eine abstrakte Klasse ist nicht für die Singleton-Funktionalität geeignet, da sie zwar statische Methoden und Felder enthalten kann, wie eine statische Klasse, aber keine Vererbung verbieten kann, sodass die Singleton-Verwendung von Unterklassen besiegt werden kann. Zumindest würde es für andere Programmierer verwirrend sein, weil seine Definition eine Absicht kommunizieren würde, die sich von der eigentlichen beabsichtigten Verwendung unterscheidet.
Die oberflächliche Ähnlichkeit zwischen abstrakten und statischen Klassen besteht nur darin, dass keine davon instanziiert werden kann. Darüber hinaus sind sie völlig unterschiedliche Tiere mit völlig unterschiedlichen Anwendungsfällen.
Die CLR hat keine Vorstellung von statischen Klassen, sie ist spezifisch für C#. Der Compiler implementiert es durch die Verwendung von CLR-Attributen für eine Klasse: es deklariert es abstrakt und versiegelt. Dies verhindert, dass irgendeine Sprache eine solche Klasse instanziiert. Dies ist, wie es aussieht, wenn Sie Ildasm laufen:
.class public abstract auto ansi sealed beforefieldinit ConsoleApplication1.Test
extends [mscorlib]System.Object
{
}
machen es versiegelt ist sehr viel der Punkt einer statischen Klasse, es als Container für statische Methoden und Felder verwendet wird. Dadurch verhalten sie sich wie globale Variablen und Funktionen wie in Sprachen wie C oder Pascal.
Eine abstrakte Klasse ist sehr genau das Gegenteil, von dem abgeleitet werden soll. Eine abstrakte Klasse, die ihres Mitglieds abstrakten hat, fungiert als eine Schnittstelle. C# hat ein Schlüsselwort dafür, wodurch die statische Klasse und die Schnittstelle die genauen Gegensätze bilden.
+1 für das Hinweis auf eine statische Klasse ist versiegelt und abstrakt unter der Haube. – Firestrand
Der Hauptzweck der abstrakten Klasse besteht darin, eine oder mehrere abstrakte Methode (n) zu definieren. Jede Klasse, die die abstrakte Klasse erweitert, implementiert die abstrakte Methode oder sie muss auch als "Abstract" deklariert werden.
Aber es ist auch möglich, eine Klasse als "Abstract" zu deklarieren, ohne eine abstrakte Methode (en) darin zu implementieren. Siehe das Beispiel unten.
public abstract class AbstractTest {
public void abcd(){}
public static void main(String[] args) {
System.out.print("hi...");
}
}
Nur innere Klasse als "Static" deklariert werden, finden Sie den Code unten. Obere/einkapselnde Klasse kann nicht als "Statisch" deklariert werden. Sie können darauf zugreifen, indem Sie Upper/encapsulating class variable.Static-inner-classname verwenden, wie bei jedem statischen Methodenaufruf, der den Klassennamen verwendet.
public class StaticTest {
public static void main(String ag[]){
System.out.println("hello...1");
StaticTest.StaticTest2.meth2();
}
public static class StaticTest2 {
public static void meth2(){
System.out.print("hello...2");
}
}
}
Hauptunterschied zwischen den beiden ist, Erweiterbarkeit.
CLR markiert alle ‚statische‘ Klassen als ‚abstrakte & versiegelt‘ hinter der Szene (dh sie können nicht damit vererbt werden kann nicht verlängert werden) und .NET Framework CLR lädt sie automatisch, wenn Programm oder Namespace enthält, geladen. Dies ergibt eine Leistungssteigerung zur Laufzeit.
Die Philosophie hinter 'abstrakten' Klassen ist die Kapitalisierung aller gemeinsamen Merkmale aller erweiterten Klassen an einem Ort.
Ich hoffe, es hilft.
- 1. Was ist der Unterschied zwischen der nicht statischen Methode und der statischen Methode einer abstrakten Klasse?
- 2. Was ist der Unterschied zwischen Objekt einer abstrakten Klasse und Liste von Objekten der abstrakten Klasse?
- 3. Was ist der Unterschied zwischen einer statischen Strukturmethode und einer statischen Klassenmethode?
- 4. Was ist der Unterschied zwischen einer statischen Methode und einer nicht statischen Methode?
- 5. Was ist der Unterschied zwischen einer abstrakten Klasse und einem Mixin?
- 6. Was ist der Unterschied zwischen statischen und nicht statischen globalen
- 7. Was ist der Umfang einer statischen Klasse?
- 8. Was ist der Unterschied zwischen einer statischen Klasse und einem Namespace? (in C#)
- 9. Unterschied zwischen abstrakten Klasse und Trait
- 10. Was ist der Unterschied zwischen einer Portnummer und einer Protokollnummer?
- 11. Was ist der Unterschied zwischen einer Subroutine und einer Funktion?
- 12. Was ist der Unterschied zwischen einer Eigenschaft und einer Instanzvariablen?
- 13. Was ist der Unterschied zwischen einer "nonce" und einer "GUID"?
- 14. Was ist der Unterschied zwischen einer HashMap und einer TreeMap?
- 15. Was ist der Unterschied zwischen einer Webreferenz und einer Servicereferenz?
- 16. Was ist der praktische Unterschied zwischen einer statischen Funktion und einer Funktion mit dem "versteckten" Sichtbarkeitsattribut?
- 17. Was ist der Unterschied zwischen einer statischen Bibliothek und einer dynamischen Bibliothek?
- 18. Aufruf einer öffentlichen, statischen Funktion in einer abstrakten Klasse
- 19. Unterschied zwischen einer Inline-Funktion und einer statischen Inline-Funktion
- 20. Was ist der Unterschied zwischen aufgeblähter Klasse und markierter Klasse?
- 21. Was ist der Unterschied zwischen einer parametrisierten Klasse und einer Metaklasse (bitte Codebeispiele in Python)?
- 22. Terminologie: Was ist der Unterschied zwischen einer Klasse und einer Komponente?
- 23. In C# Was ist der Unterschied zwischen einem Destruktor und einer Finalize-Methode in einer Klasse?
- 24. Was ist der Unterschied zwischen einem Bündel und einer Absicht?
- 25. Was ist der Unterschied zwischen einem URI und einer URL?
- 26. Was ist der Unterschied zwischen BackgroundImage und Image einer Schaltfläche?
- 27. Was ist der Unterschied zwischen einem Algorithmus und einer Funktion?
- 28. Was ist der Unterschied zwischen einer Funktion und * Funktion?
- 29. Was ist der Unterschied zwischen einem Fehler und einer Ausnahme?
- 30. Was ist der Unterschied zwischen einem Benutzer und einer Rolle?
Denken Sie daran, Thread-Sicherheit bei der Verwendung von statischen Klassen zu berücksichtigen. [Siehe hier] (http://stackoverflow.com/questions/1090650/are-static-methods-thread-safe) – kenchilada