2011-05-01 24 views
34

En una clase base abstract si tenemos algunos campos static, ¿qué ocurre con ellos?Campos estáticos en una clase base y clases derivadas

¿Es su alcance las clases que heredan de esta clase base o solo del tipo del que hereda (cada subclase tiene su propia copia del campo static de la clase base abstract)?

+0

Por cierto, el hecho de que la clase base es 'abstract' es una cortina de humo; no importa si la clase base es 'abstracta' o no, el comportamiento que señala @Marc Gravell es el mismo. – casperOne

+0

@casperOne: Estaba buscando algo como 'TypeLocal ' ya que tenemos 'ThreadLocal ' por lo que cualquier objeto de ese tipo sería 'static' en su correspondiente' subclass'. – Xaqron

Respuesta

54

static miembros son enteramente específicos de la declarando clase; las subclases no obtienen copias separadas. La única excepción aquí es genéricos; si un tipo genérico abierto declara campos estáticos, el campo es específico para esa exacta combinación de tipo argumentos que conforman el tipo genérico cerrado; es decir, Foo<int> tendría campos estáticos separados para Foo<string>, suponiendo que los campos están definidos en Foo<T>.

+0

@Marc Gravell: Lo siento, tú y @Jon Skeet me enseñaron a ser pedante; querías decir "escribir argumentos" en lugar de "argumentos estáticos". =) Espero que todo esté bien al otro lado del charco. – casperOne

+2

¿Cómo declarar una variable única para todas las instancias (por tipo) de 'clase base'? – Xaqron

+0

@ Xaqron: no se puede, debería redeclarar el miembro estático que desea en cada clase derivada. – casperOne

8

Como se señala en otra respuesta, el campo estático de la clase base se compartirá entre todas las subclases. Si necesita una copia separada para cada subclase final, puede utilizar un diccionario estático con un nombre de subclase como una clave:

class Base 
{ 
    private static Dictionary<string, int> myStaticFieldDict = new Dictionary<string, int>(); 

    public int MyStaticField 
    { 
     get 
     { 
      return myStaticFieldDict.ContainsKey(this.GetType().Name) 
        ? myStaticFieldDict[this.GetType().Name] 
        : default(int); 
     } 

     set 
     { 
      myStaticFieldDict[this.GetType().Name] = value; 
     } 
    } 

    void MyMethod() 
    { 
     MyStaticField = 42; 
    } 
} 
Cuestiones relacionadas