2010-03-06 6 views

Antwort

19

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.

Here's more detail on using abstracts.

+3

Eine statische Klasse in C# ist eine versiegelte abstrakte Klasse –

2

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).

15

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).

2

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.

7

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.

6

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.

+0

+1 für das Hinweis auf eine statische Klasse ist versiegelt und abstrakt unter der Haube. – Firestrand

1

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"); 
    } 
} 

}

-1

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.

Verwandte Themen