Ninguno es instanciable. ¿Cuáles son las diferencias y en qué situaciones podría usar uno u otro?¿Cuál es la diferencia entre una clase abstracta y una estática?
Respuesta
static
indica que la clase solo puede tener miembros estáticos y no puede crear una instancia de la misma. Esto se usa para la funcionalidad sin estado (por ejemplo, un tipo que solo define métodos de extensión o métodos de utilidad). También puede declarar un miembro static
en una clase no estática. Esto le permite adjuntar funcionalidad a un tipo sin tener que crear una instancia.
Here's more detail on using static members and classes.
abstract
s definen la estructura básica y la funcionalidad compartida por todos los tipos derivados, pero no pueden ser utilizadas por ellos mismos. Piense en ellos como, supongo, una impresión azul y un contrato. Este es un concepto central para OOP.
una clase estática en C# es una clase abstracta sellada –
Las clases abstractas se crean de forma indirecta a través de clases derivadas. Proporcionan un comportamiento común y estado de instancia, pero indican que se requiere más y debe ser proporcionado por clases concretas derivadas. Por ejemplo, Transform
podría ser una clase abstracta: declara un método Apply(Shape)
común, pero no hay implementación de ese método. Las clases derivadas de hormigón como Rotation
o Translation
implementarán ese método, y las clases pueden ser instanciadas.
Las clases estáticas no se pueden crear instancias, y cualquier estado está en el nivel de clase en lugar del nivel de instancia. Normalmente se usan para definir métodos de utilidad donde no hay un estado asociado con los métodos. Transform
no podría ser una clase estática, porque las clases derivadas concretas necesitan estado por instancia (por ejemplo, Rotation
necesita una instancia por instancia Angle
, porque diferentes transformaciones Rotation
podrían ser de diferentes ángulos).
Aquí es un breve resumen:
- Una clase estática sólo puede contener
static
miembros (es sólo un contenedor para métodos que no pertenecen lógicamente a una instancia de cualquier clase estándar) - Un resumen clase puede cotnain todo tipo habituales de los miembros (estática, abstractas y también instancia)
La diferencia clave es que se puede heredar de una clase abstract
, pero no se puede heredar de una clase static
. Técnicamente hablando, el tiempo de ejecución de .NET no tiene ninguna noción de clases static
, por lo que el compilador de C# las cumple como clases que son abstract
y sealed
(lo que significa que no puede heredar de ellas).
Así, static
clases son abstract
clases que son también sealed
(aunque esta no es la forma habitual de mirar el problema si usted es programador de C#) y estar constituido únicamente static
miembros (que es impuesta por el compilador de C#).
Las clases abstractas están destinadas a ser utilizadas como clases base; no pueden tener instancias directas. En su lugar, debe derivar subclases, que proporcionan lo que fue (generalmente intencionalmente) omitido en la clase base abstracta.
Ejemplo: considere que tiene una aplicación compleja, donde los usuarios pueden iniciar sesión.Varios mecanismos de autenticación deberían ser utilizables, por ejemplo, LDAP, NTLM, lo que sea. Una forma de modelar un "usuario" o "principal" en dicho contexto sería recopilar, lo que es común en todos esos mecanismos, en una clase base abstracta, y dejar "huecos" (métodos abstractos) donde las implementaciones reales entran en juego. juega:
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);
}
Aquí, el almacenamiento en caché de los usuarios es una preocupación común, modelada en el caso base, mientras que el retreival real se deja para una subclase de proporcionar.
La clase estática es una cuestión totalmente diferente. Son esencialmente un lugar para mantener sus funciones de utilidad:
static class StrUtil {
public static string TrimWhitespace(string str) {
...
}
}
pensar en ellos como una especie de espacio de nombres especiales, que sólo puede contener miembros estáticos. Básicamente, un lugar para poner funciones.
Una clase abstracta está destinada a ser utilizada como base de una jerarquía de herencia de clases. Una clase estática no puede ser ser la base de una jerarquía de herencia de clase.
Una clase estática está diseñada para el estado singleton o la funcionalidad sin estado. Una clase abstracta no es adecuada para la funcionalidad singleton, porque aunque puede contener métodos y campos estáticos como lo hace una clase estática, no puede prohibir la herencia, por lo que el uso único puede ser vencido por subclases. O, al menos, sería confuso para otros programadores, ya que su definición comunicaría una intención que es diferente de su uso real previsto.
La similitud superficial entre las clases abstractas y estáticas se debe únicamente al hecho de que ninguna de las dos se puede instanciar. Más allá de eso, son animales completamente diferentes con casos de uso completamente diferentes.
El CLR no tiene noción de clases estáticas, es específico de C#. El compilador lo implementa mediante el uso hábil de los atributos CLR para una clase: lo declara abstracto y sellado. Eso evita que cualquier idioma ejemplifique tal clase. Esto es lo que parece cuando se ejecuta Ildasm:
.class public abstract auto ansi sealed beforefieldinit ConsoleApplication1.Test
extends [mscorlib]System.Object
{
}
Por lo que es sellado es mucho el punto de una clase estática, se utiliza como contenedor de los métodos estáticos y campos. Lo que los hace actuar como variables globales y funciones como las que tienes en idiomas como C o Pascal.
Una clase abstracta es todo lo contrario, está diseñada para ser derivada de. Una clase abstracta que tiene todo de su miembro abstracto actúa como una interfaz. C# tiene una palabra clave para eso, hacer clases estáticas e interconectar los opuestos exactos.
+1 para indicar que una clase estática está sellada y resumen bajo el capó. – Firestrand
El propósito principal de la clase abstracta es definir uno o más métodos abstractos. Cualquier clase que extienda clase abstracta implementará el método abstracto o también debe declararse como "Resumen".
Pero, también es posible declarar una clase como "Abstracta" sin implementar ningún método abstracto (s) en ella. Vea la muestra a continuación.
pública AbstractTest clase abstracta {
public void abcd(){}
public static void main(String[] args) {
System.out.print("hi...");
}
}
Sólo clase interna puede ser declarado como "estática", ver el código de abajo. La clase superior/encapsulante no se puede declarar como "Estática". Se puede acceder utilizando la variable de clase Upper/encapsulating.Static-inner-classname, es decir, como cualquier invocación de método estático que utilice el nombre de clase.
StaticTest public class {
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");
}
}
}
La principal diferencia entre los dos es la extensibilidad.
CLR marcas de todas las clases 'estáticos' como 'abstracta & sellados' detrás de la escena (es decir, que no se puede heredar por lo tanto, no puede ampliarse) y .NET Framework CLR los carga automáticamente cuando contengan programa o espacio de nombres se cargado. Esto proporciona una ganancia de rendimiento en el tiempo de ejecución.
La filosofía detrás de las clases 'abstractas' está capitalizando todas las características comunes de todas las clases extendidas en un solo lugar.
Espero que ayude.
- 1. ¿Cuál es la diferencia entre una clase concreta y una clase abstracta?
- 2. ¿Cuál es la diferencia entre una clase estática y una clase normal?
- 3. ¿Cuál es la diferencia entre una interfaz y una clase abstracta?
- 4. Diferencia entre la clase abstracta y Rasgo
- 5. ¿cuál es la diferencia entre una clase y una biblioteca?
- 6. Diferencia entre clase simple y clase estática?
- 7. ¿Cuál es la diferencia entre importar y extender una clase?
- 8. ¿Cuál es la diferencia entre un patrón de Singleton y una clase estática en Java?
- 9. ¿Cuál es la diferencia entre una clase estática y un espacio de nombres? (en C#)
- 10. ¿Cuál es la diferencia entre la vinculación estática y dinámica?
- 11. ¿cuál es la diferencia entre propiedad estática y singleton?
- 12. clase abstracta estática
- 13. ¿Cuál es la diferencia entre una sesión y una cookie?
- 14. ¿Cuál es la diferencia entre una subrutina y una función?
- 15. ¿Cuál es la diferencia entre una vista y una secuencia?
- 16. ¿Cuál es la diferencia entre los métodos estáticos en una clase no estática y los métodos estáticos en una clase estática?
- 17. ¿Cuál es una práctica común de completar la clase abstracta?
- 18. ¿Cuál es la diferencia entre Test t; y Prueba t() ;? Si la prueba es una clase
- 19. Heredar variable estática de la clase abstracta
- 20. Terminología: ¿Cuál es la diferencia entre una clase y un componente?
- 21. ¿Cuál es la diferencia entre una referencia __weak y __block?
- 22. ¿Cuál es la diferencia entre un hilo y una fibra?
- 23. ¿Cuál es la diferencia entre un algoritmo y una función?
- 24. ¿Cuál es la diferencia entre una matriz y un objeto?
- 25. ¿Cuál es la diferencia entre una mónada y un cierre?
- 26. ¿Cuál es la diferencia entre una instancia y un objeto?
- 27. ¿Cuál es la diferencia entre un tema y una plantilla?
- 28. ¿Cuál es la diferencia entre declarar y definir una estructura?
- 29. ¿Cuál es la diferencia entre pánico y una afirmación?
- 30. ¿Cuál es la diferencia entre un RoutedCommand y una RoutedUICommand?
Recuerde tener en cuenta la seguridad de subprocesos al usar clases estáticas. [Ver aquí] (http://stackoverflow.com/questions/1090650/are-static-methods-thread-safe) – kenchilada