2010-03-06 24 views

Respuesta

19

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.

Here's more detail on using abstracts.

+3

una clase estática en C# es una clase abstracta sellada –

2

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

15

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

2

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.

7

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.

6

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.

+0

+1 para indicar que una clase estática está sellada y resumen bajo el capó. – Firestrand

1

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

}

-1

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.

Cuestiones relacionadas