2010-09-23 30 views
5

No entiendo el siguiente fenómeno, ¿podría alguien explicarme por favor lo que obtuve mal?Herencia y propiedades estáticas

public class BaseClass 
{ 
    public BaseClass() 
    { 
     BaseClass.Instance = this; 
    } 

    public static BaseClass Instance 
    { 
     get; 
     private set; 
    } 
} 

public class SubClassA : BaseClass 
{ 
    public SubClassA() 
     : base() 
    { } 
} 

public class SubClassB : BaseClass 
{ 
    public SubClassB() 
     : base() 
    { } 
} 

class Program 
{ 
    static void Main(string[] args) 
    { 
     SubClassA a = new SubClassA(); 
     SubClassB b = new SubClassB(); 

     Console.WriteLine(SubClassA.Instance.GetType()); 
     Console.WriteLine(SubClassB.Instance.GetType()); 

     Console.Read(); 
    } 
} 

Según entendí, el compilador debe generar un nuevo tipo través de la herencia, que SubClassA y SubClassB son realmente propios tipos con variables estáticas propias. Pero parece que la parte estática de la clase no se hereda sino que se hace referencia a ella: ¿qué me pasa?

Respuesta

10

La herencia en .NET funciona solo en la base de instancias. Los métodos estáticos se definen en el nivel de tipo, no en el nivel de instancia. Es por eso que la anulación no funciona con métodos/propiedades/eventos estáticos ...

Los métodos estáticos solo se guardan una vez en la memoria. No hay una tabla virtual, etc., que se haya creado para ellos.

Si invoca un método de instancia en .NET, siempre le da la instancia actual. Esto está oculto por el tiempo de ejecución de .NET, pero sucede. Cada método de instancia tiene como primer argumento un puntero (referencia) al objeto sobre el que se ejecuta el método. Esto no sucede con los métodos estáticos (como se definen en el nivel de tipo). ¿Cómo debería el compilador decidir seleccionar el método para invocar?

+0

Yo no lo entiendo por qué la herencia sólo funciona en los casos, pero tengo que aceptarlo. Gracias por esa información. –

+0

El mismo comportamiento se implementa en PHP y Delphi –

+0

@VladislavRastrusny: No sé cómo es en 2010. Pero ahora en 2016, hay 'self ::' y 'static ::' en PHP. –

13

Solo hay una propiedad estática Instance, y está definida en BaseClass, que también es el único tipo que puede cambiarla (ya que el conjunto es private).

Lo que sucede es que sus subclases SubClassA y SubClassB invocan cada uno el constructor BaseClass en sus propios constructores. Este constructor establece Instance en la instancia BaseClass que se está inicializando.

La última instancia de este tipo en el código de ejemplo es una instancia de SubClassB; de ahí que la propiedad oneInstance esté configurada en esta instancia cuando llegue a las llamadas Console.WriteLine.

Se podría revertir la construcción de sus SubClassA y SubClassB objetos y que se vería Instance conjunto a una instancia de SubClassA lugar.

+0

+1 para también explicar por qué escribe SubClassB dos veces –

Cuestiones relacionadas