2010-03-06 11 views

risposta

19

static indica che la classe può avere solo membri statici e non è possibile crearne un'istanza. Viene utilizzato per funzionalità senza stato (ad esempio un tipo che definisce solo metodi di estensione o metodi di utilità). È inoltre possibile dichiarare un membro static su una classe non statica. Ciò ti consente di collegare funzionalità a un tipo senza doverlo istanziare.

Here's more detail on using static members and classes.

abstract s definiscono la struttura di base e la funzionalità condivisa da tutti i tipi di derivati, ma non possono essere utilizzati da soli. Pensa a loro come, suppongo, una stampa blu e un contratto. Questo è un concetto fondamentale per OOP.

Here's more detail on using abstracts.

+3

una classe statica in C# è una classe astratta sigillata –

2

Le classi astratte vengono istanziate indirettamente tramite classi derivate. Forniscono un comportamento e uno stato di istanza comuni, ma segnalano che è necessario un numero maggiore e devono essere forniti da classi concrete derivate. Ad esempio, Transform potrebbe essere una classe astratta: dichiara un metodo comune Apply(Shape), ma nessuna implementazione di tale metodo. Classi derivate dal calcestruzzo come Rotation o Translation implementeranno tale metodo e quelle classi possono essere istanziate..

Le classi statiche non possono essere istanziate e qualsiasi stato è a livello di classe anziché a livello di istanza. In genere vengono utilizzati per definire i metodi di utilità in cui non esiste uno stato associato ai metodi. Transform non può essere una classe statica, poiché le classi derivate dal calcestruzzo richiedono lo stato per istanza (ad esempio Rotation ha bisogno di una istanza Angle, perché le diverse trasformazioni Rotation potrebbero essere di angoli diversi).

15

Ecco un breve riassunto:

  • una classe statica può contenere solo static membri (si tratta solo di un contenitore per i metodi che non logicamente appartengono a un'istanza di qualsiasi classe standard)
  • Un abstract classe può cotnain tutti i tipi usuali di membri (statici, astratti e anche di istanza)

La differenza fondamentale è che si può ereditare da una classe abstract, ma non si può ereditare da una classe static. Tecnicamente parlando, il runtime .NET non ha alcuna nozione delle classi static, quindi il compilatore C# le soddisfa come classi che sono sia abstract e sealed (ovvero che non è possibile ereditarle).

Quindi, static classi sono abstract classi che sono anche sealed (anche se questo non è il solito modo di guardare il problema se si è programmatore C#) e contenere solo static membri (che viene applicata dal compilatore C#).

2

Le classi astratte devono essere utilizzate come classi di base; non possono avere istanze dirette. Invece, devi derivare sottoclassi, che forniscono ciò che era (di solito intenzionalmente) lasciato nella classe base astratta.

Esempio: considera di avere un'applicazione complessa, a cui gli utenti possono accedere.Diversi meccanismi di autenticazione dovrebbero essere utilizzabili, ad esempio LDAP, NTLM, è il nome. Un modo per modellare un "utente" o un "principale" in un tale contesto sarebbe quello di raccogliere, ciò che è comune tra tutti questi meccanismi, in una classe base astratta e lasciare "vuoti" (metodi astratti) in cui entrano in gioco le reali implementazioni gioca:

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

Qui, il caching degli utenti è una preoccupazione comune, modellato nel caso base, mentre il retreival attuale è lasciato per una sottoclasse di fornire.

Le classi statiche sono una cosa completamente diversa. Sono essenzialmente un posto per mantenere le funzioni di utilità:

static class StrUtil { 

    public static string TrimWhitespace(string str) { 
     ... 
    } 
} 

pensare a loro come una sorta di spazio dei nomi speciale, che può contenere solo membri statici. Fondamentalmente, un posto dove mettere le funzioni.

7

Una classe astratta deve essere utilizzata come base di una gerarchia di ereditarietà di classe. Una classe statica non può essere la base di una gerarchia di ereditarietà di classe.

Una classe statica è destinata allo stato Singleton oa funzionalità stateless. Una classe astratta non è adatta per la funzionalità di singleton, perché, anche se può contenere metodi e campi statici come fa una classe statica, non può proibire l'ereditarietà, quindi l'uso singleton può essere sconfitto da sottoclassi. O, per lo meno, sarebbe fonte di confusione per gli altri programmatori, perché la sua definizione avrebbe comunicato un intento che è diverso dal suo uso previsto.

La somiglianza superficiale tra classi astratte e statiche è solo nel fatto che nessuno dei due può essere istanziato. Oltre a ciò, sono animali completamente diversi con casi d'uso completamente diversi.

6

Il CLR non ha nozioni di classi statiche, è specifico di C#. Il compilatore lo implementa tramite l'utilizzo slick degli attributi CLR per una classe: lo dichiara astratto e sigillato. Ciò impedisce a qualsiasi linguaggio di istanziare una classe del genere. Questo è quello che sembra quando si esegue Ildasm:

.class public abstract auto ansi sealed beforefieldinit ConsoleApplication1.Test 
     extends [mscorlib]System.Object 
{ 
} 

Rendere sigillato è molto il punto di una classe statica, è utilizzato come contenitore per i metodi e campi statici. Il che li fa agire come variabili globali e funzioni come quelle che hai in linguaggi come C o Pascal.

Una classe astratta è esattamente l'opposto, è progettata per essere derivata da. Una classe astratta che ha del suo membro abstract funge da interfaccia. C# ha una parola chiave per questo, rendendo la classe statica e interfacciare gli opposti esatti.

+0

+1 per indicare che una classe statica è sigillata e astratto sotto il cofano. – Firestrand

1

Lo scopo principale della classe astratta è definire uno o più metodi astratti. Qualsiasi classe che estende la classe Abstract implementerà il metodo astratto, oppure dovrà anche essere dichiarata come "Abstract".

Tuttavia, è anche possibile dichiarare una classe come "Abstract" senza implementare alcun metodo astratto (s) in esso. Guarda l'esempio qui sotto.

public abstract class AbstractTest {

public void abcd(){} 

public static void main(String[] args) { 

     System.out.print("hi..."); 

} 

}

Solo classe interna può essere dichiarata come "Static", vedere il codice di seguito. La classe superiore/incapsulante non può essere dichiarata come "Statica". È possibile accedervi utilizzando la variabile di classe Upper/encapsulating.Static-inner-classname è uguale a qualsiasi altra chiamata di metodo statico che utilizza il nome di classe.

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

differenza principale tra i due è l'estensibilità.

CLR contrassegni tutte le classi 'statiche' come 'astratto & sigillata' dietro la scena (cioè, non può essere ereditata quindi non può essere esteso) e .NET Framework CLR li carica automaticamente quando contengono programma o spazio viene caricato. Ciò offre un guadagno in termini di prestazioni in fase di esecuzione.

La filosofia dietro le classi "astratte" sta capitalizzando tutte le caratteristiche comuni di tutte le classi estese in un unico posto.

Spero che aiuti.

Problemi correlati