Né è istantaneo. Quali sono le differenze e in quali situazioni potresti utilizzare l'una o l'altra?Qual è la differenza tra una classe astratta e una statica?
risposta
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.
una classe statica in C# è una classe astratta sigillata –
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).
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#).
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.
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.
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.
+1 per indicare che una classe statica è sigillata e astratto sotto il cofano. – Firestrand
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");
}
}
}
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.
- 1. Qual è la differenza tra una classe astratta e un'interfaccia?
- 2. Qual è la differenza tra una classe statica e una classe normale?
- 3. Qual è la differenza tra una classe e una libreria?
- 4. Qual è la differenza tra const, readonly e ottenere in una classe statica
- 5. Qual è la differenza tra una classe statica e uno spazio dei nomi? (in C#)
- 6. Differenza tra classe astratta e Trait
- 7. Qual è la differenza tra una filettatura e una fibra?
- 8. Qual è la differenza tra una monade e una chiusura?
- 9. Qual è la differenza tra una Seam e una Mock?
- 10. Qual è la differenza tra una subroutine e una funzione?
- 11. Qual è la differenza tra una tupla e una compressa_pair?
- 12. Differenza tra caricare una classe e istanziarla
- 13. Differenza tra interfaccia, classe astratta, classe sigillata, classe statica e classe parziale in C#?
- 14. Qual è la differenza tra metodi e statica in Mongoose?
- 15. Qual è la differenza tra rilegatura statica e dinamica?
- 16. qual è la differenza tra proprietà statica e singleton?
- 17. Differenza tra una funzione inline e una funzione inline statica
- 18. Qual è la differenza tra una chiave e un KeySpec?
- 19. Qual è la differenza tra classe astratta e interfaccia in termini di archiviazione in JVM
- 20. Qual è la differenza tra una discussione e un gestore
- 21. Qual è la differenza tra una chiusura e un modulo?
- 22. Qual è la differenza tra una vista e uno stream?
- 23. Qual è la differenza tra un algoritmo e una funzione?
- 24. Qual è la differenza tra JTA e una transazione locale?
- 25. Qual è la differenza tra = e => per una variabile?
- 26. Qual è la differenza tra un'API e una SOA
- 27. Qual è la differenza tra un'app Facebook e una scheda?
- 28. Qual è la differenza tra oggetti e classi in C#?
- 29. Qual è la differenza tra una variabile statica in C++ rispetto a C#?
- 30. Differenza tra statica finale e statica finale
Ricordare di considerare la sicurezza del thread quando si utilizzano classi statiche. [Vedi qui] (http://stackoverflow.com/questions/1090650/are-static-methods-thread-safe) – kenchilada