c# - polimorfico - ¿Cómo puede una clase estática derivar de un objeto?
metodos extendidos c# (14)
¿No todas las clases (estáticas incluidas) ya derivan del objeto? Como en, por defecto?
Además, como dice, "La clase estática no puede derivar del tipo", así que no creo que lo que estás haciendo sea posible. ¿Por qué querrías una clase estática para derivar de un tipo de todos modos?
Intento heredar una clase no estática por una clase estática.
public class foo
{ }
public static class bar : foo
{ }
Y entiendo:
La clase estática no puede derivar de tipo. Las clases estáticas deben derivar de un objeto.
¿Cómo puedo derivarlo del objeto?
El código está en C #.
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.
De la especificación C # 3.0, sección 10.1.1.3:
Una clase estática puede no incluir una especificación de 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 puedes hacer esto.
El mensaje de error es engañoso.
bar no puede heredar de foo porque foo puede crearse una instancia y la barra no puede.
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".
No creo que C # sea compatible con la herencia de las clases estáticas.
Una opción sería usar el patrón singleton en su 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
}
No puede. Tienes que crear una clase normal para derivar de alguna otra clase.
Si intenta evitar que las personas creen instancias de la clase, simplemente agregue un constructor predeterminado privado.
Todas las clases 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.
Tomado de http://msdn.microsoft.com/en-us/library/79b3xss3(VS.80).aspx
Las principales características de una clase estática son:
Solo contienen miembros estáticos.
No pueden ser instanciados.
Ellos están sellados.
No pueden contener constructores de instancias (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.
No tiene ningún valor derivar clases estáticas. Las razones para usar herencia son:
- Polimorfismo
- Reutilización de código
No se puede obtener un polimorfismo con clases estáticas, obviamente, porque no hay ninguna instancia para el envío dinámico (es decir, no se puede pasar una barra a una función esperando un Foo, ya que no se 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.
Como ha señalado Christopher, 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í, la clase de barra derivada de foo , por lo tanto, la clase estática La barra tiene un miembro no estático myVar ahora, y de acuerdo con la especificación c #, ¡la clase estática no puede contener miembros no estáticos!
la clase estática no puede ser una 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.
Como se dijo en otra respuesta, el mensaje del compilador es confuso pero correcto. Puedes escribir:
static class A : object
{
}
por supuesto, no es realmente útil indicar explícitamente esta herencia, pero la herencia en sí misma es realmente útil en el marco mientras se anulan los 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();
}
}