Clases genéricas y campos estáticos

¿Hay alguna manera de compartir una variable estática entre varias clases genéricas diferentes?

Tengo una clase

class ClassA <T> : ObservableCollection<T> {

    static int counter;

    //...
}

y un par de instancias con diferentes instanciaciones de parámetros, como

ClassA<int> a = new ClassA<int>();
ClassA<double> b = new ClassA<double>();
ClassA<float> c = new ClassA<float>();

¿Hay alguna forma de que las instancias a, b y c compartan el contador de campo estático?

Cualquier respuesta y comentario es muy apreciado :)

preguntado el 11 de junio de 12 a las 19:06

No, pero puede heredar de una clase base no estática y declarar la estática como "protegida". Además, estoy bastante seguro de que esta es una pregunta duplicada, pero no puedo encontrar ninguna otra como esta en este momento, así que +1 para una pregunta buena y bien planteada. -

Olvidé mencionar que ya estoy heredando de una clase genérica lo que hace que mi intento sea un poco más difícil, supongo... -

3 Respuestas

Puede envolver el contador en su propia clase singleton, luego hacer referencia a la clase de contador de A, B y C.

Respondido el 11 de junio de 12 a las 19:06

¡ESO ES! :) Qué solución tan elegante y obvia. No creo que uno pueda hacerlo mejor... Muchas gracias por salvarme el día :) - Marc Wellman

Los campos estáticos dependen de su clase (así es como C# maneja qué miembros estáticos son cuáles), y cuando pasa un tipo genérico diferente, está definiendo efectivamente una clase separada.

Entonces, no. Algo así como un contador compartido probablemente sería mejor manejado por cualquier clase que llame a Thing That Counts, ya que es esa clase la que estará más interesada en el estado de ese contador de todos modos. Si no puede hacer esto por alguna razón (esta clase está siendo referenciada por un montón de subprocesos no relacionados), entonces puede hacer una clase estática para mantener el estado de la biblioteca, pero esto causa problemas con la capacidad de prueba, así que intentaría para evitarlo si puedes.

Respondido el 11 de junio de 12 a las 19:06

Muchas gracias por tu comentario :) - Marc Wellman

La solucion mas simple:

class Program
{
    static void Main(string[] args)
    {
        ClassA<int> a = new ClassA<int>();
        ClassA<double> b = new ClassA<double>();
        Console.WriteLine(a.GetCounterAndAddOne());
        Console.WriteLine(b.GetCounterAndAddOne());
        Console.Read();
    }
}

class BaseA
{
    protected static int counter = 0;
}

class ClassA<T> : BaseA
{
    public int GetCounterAndAddOne()
    {
        return BaseA.counter++;
    }
}

La primera llamada a GetCounterAndAddOne establece el contador en 0, la segunda llamada establece el contador en 1 y continuará según sea necesario.

Respondido el 13 de Septiembre de 21 a las 18:09

Muchas gracias por tu comentario :) - Marc Wellman

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.