2009-02-17 28 views
37

Estoy tratando de heredar una clase no estática por una clase estática.¿Cómo se puede derivar una clase estática de un objeto?

public class foo 
{ } 

public static class bar : foo 
{ } 

y me sale:

clase estática no puede derivar de tipo. Las clases estáticas deben derivar del objeto .

¿Cómo puedo obtenerlo del objeto?

El código está en C#.

+1

¿Hay un caso de uso para esto? –

Respuesta

48

No tiene sentido derivar clases estáticas. Las razones para utilizar la herencia son:

  • polimorfismo
  • la reutilización de código

No puede obtener el polimorfismo con clases estáticas, obviamente, porque no hay ninguna instancia de despachar de forma dinámica en (en otras palabras , no es como si pudiera pasar una barra a una función esperando un Foo, ya que no tiene tiene una barra).

La reutilización de código se resuelve fácilmente usando la composición: le da a Bar una instancia estática de Foo.

+3

+1 Por proporcionar una solución simple y apropiada al problema del OP. – Brian

+0

Perdón por "buscar hilos" pero quiero hacer lo mismo y aunque creo que tu respuesta es buena, me pregunto cómo abordarías el caso de uso donde 'foo' tiene algunos métodos protegidos que' bar 'Me gustaría usar. – Samo

+2

¿Estás diciendo que quieres una clase * Bar * 'estática que hereda de un * Foo' * no estático para que pueda llegar a sus miembros protegidos? Hay mucha pesadez en ese diseño (es raro que una sola clase tenga sentido tanto en un contexto estático como no estático).Pero, suponiendo que tenga una razón válida para esto, una solución es tener 'Bar' con una clase interna privada no estática que herede de' Foo' (llámelo 'FooWrapper'). Tiene métodos públicos que remiten a los protegidos que hereda. 'Bar' puede tener una instancia de' FooHelper' y llegar a los miembros protegidos en 'Foo' a través de eso. – munificent

0

¿No todas las clases (estáticas incluidas) ya se derivan del objeto? Como en, por defecto?

Además, como se dice, "La clase estática no puede derivar del tipo.", Por lo que no creo que lo que está haciendo sea posible. ¿Por qué querrías una clase estática para derivar de un tipo de todos modos?

0

No puede. Tienes que crear una clase normal para derivar de alguna otra clase.

2

No creo que C# admita herencia para las clases estáticas.

Una opción sería utilizar el patrón Singleton lugar

public class foo 
{ } 

public class bar : foo 
{ 
    private bar instance; 
    public bar GetInstance() 
    { 
     if(instance == null) instance = new bar(); 
     return instance; 
    } 

    private bar(){} //make default constructor private to prevent instantiation 
} 
+0

Singleton no es algo que recomiendo. Tenga mucho cuidado al usarlo. Ver: http://www.google.com/search?source=ig&hl=en&rlz=&=&q=singleton+bad&btnG=Google+Search&aq=f –

+2

Creo que su ejemplo es defectuoso, si dos hilos tienen éxito pasando el si (instancia == null) instanciará una nueva barra dos veces. – TomHastjarjanto

+0

El código anterior genera un error: las clases estáticas no pueden tener constructores de instancias – Ali

13

El mensaje de error es falso. No está diciendo "un" objeto. Se trata del tipo incorporado llamado "objeto" que es la base de todo en .NET.

Debería decir "las clases estáticas no pueden especificar un tipo de base".

+4

No, debería decir "Las clases estáticas no pueden especificar un tipo base. Las clases estáticas siempre derivan implícitamente de System.Object". Tenga en cuenta que tampoco puede derivar una clase estática de otra clase estática. –

+1

Corregido. Gracias Jon. – GeekyMonkey

0

Todas las clases se derivan implícitamente de Object. Dicho esto, aunque las clases estáticas (que por definición son solo contenedores para miembros estáticos) "derivan" del objeto, no hay nada que puedas obtener de ese hecho.

0

El mensaje de error es engañoso.

bar no puede heredar de foo porque foo se puede crear una instancia y la barra no.

+1

Esa no es una razón en sí misma. La especificación de C# podría haber permitido este caso, simplemente sucede que no. –

+3

¡Mierda, es Jon Skeet! * se siente bendecido o algo * ;-) – teedyay

22

partir de la especificación C# 3.0, sección 10.1.1.3:

una clase estática puede no incluir una especificación clase-base (§10.1.4) y no puede especificar explícitamente una clase base o una lista de interfaces implementadas. Una clase estática hereda implícitamente de tipo object.

En otras palabras, no puede hacer esto.

7

Tomado de http://msdn.microsoft.com/en-us/library/79b3xss3(VS.80).aspx

Las principales características de una clase estática son:

Sólo contienen los miembros estáticos.

No se pueden crear instancias.

Están sellados.

No pueden contener Instancia Constructores (Guía de programación C#).

Por lo tanto, heredar de una clase no estática viola la primera característica de las clases estáticas en esta lista al introducir miembros no estáticos a su clase estática.

+1

Esta es la respuesta que aborda el problema raíz. – Anshul

+0

Es una pena que no te permitan heredar de una clase estática realmente, ya que acabo de encontrar un escenario en el que hubiera sido útil. Si se implementara, simplemente proporcionaría un constructor estático sin parámetros para llamar al constructor de la clase base, y todos los miembros de la instancia se convertirían en miembros estáticos ... –

1

Como se dijo anteriormente, las especificaciones de C# dicen que esto no se puede hacer. Tampoco puedes implementar una interfaz con clases estáticas. Su mejor opción es cambiar de usar una clase estática a usar una clase que usa el patrón singleton. Solo tendrá una instancia (similar a la forma en que funciona la clase estática) y podrá heredar el comportamiento o implementar interfaces.

Lea en Singletons here, here y here.

0

Si está tratando de evitar que las personas creen instancias de la clase, simplemente agregue un constructor predeterminado privado.

+0

Mi objetivo es dejar de crear instancias de compás, pero el El problema con el constructor privado sería que necesitaría cambiar las variables y funcionar en foo también en estático para poder acceder a ellas. – Ali

+0

En ese caso, debe usar composición en lugar de herencia; bar contiene una instancia estática de solo lectura de foo. –

0

clase estática no puede ser clase base para otras clases y no se puede extender.

La clase estática solo se puede heredar de la clase "objeto" (clase base .net).

Información adicional: Todas las clases en .net heredadas de la clase "objeto", incluso cualquier clase estática también.

La diferencia es que aunque la clase estática hereda "clase de objeto" hereda solo dos métodos estáticos de la clase "objeto".

Otras clases no estáticas heredan otros cuatro métodos.

0

Como dije en otra respuesta, el mensaje del compilador es confuso pero correcto.Usted puede escribir:

static class A : object 
{ 
} 

por supuesto, no es realmente útil para indicar explícitamente esta herencia, pero la herencia en sí es realmente útil en el marco como se reemplaza miembros virtuales del objeto:

static class A : object 
    { 
     public static new string ToString() 
     { 
      return "I am object A"; 
     } 

     public static new int GetHashCode() 
     { 
      return ToString().GetHashCode(); 
     } 
    } 
0

Como Christopher Hemos señalado, supongamos que podemos derivar la clase estática de la clase no estática.

por ejemplo:

public class foo 
{ 
    public int myVar; 
} 

public static class bar : foo { } 

aquí, bar clase derivada de foo, por lo tanto clase estática Bar tiene no estático miembro myVar ahora, y de acuerdo con el C# Especificación, estático ¡Class no puede contener miembros no estáticos!

Cuestiones relacionadas