2012-06-11 2 views
4

Есть ли способ поделиться одной статической переменной между несколькими разными родовыми классами?Общие классы и статические поля

У меня есть класс

class ClassA <T> : ObservableCollection<T> { 

    static int counter; 

    //... 
} 

и несколько экземпляров его с различной конкретизацией параметров, как

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

Есть ли способ, что случаи а, Ь, с поделиться счетчик статического поля?

Любые ответы и комментарии очень высоко ценится :)

+4

Нет, но вы можете наследовать от нестатической базового класса и объявите статическую как «защищенную». Кроме того, я уверен, что это дублированный вопрос, но я не могу найти других, как сейчас, так что +1 для хорошего, корректного вопроса. – Cameron

+0

Я забыл упомянуть, что я уже наследую от родового класса, что делает мою попытку немного сложнее, я думаю ... –

ответ

4

Вы можете обернуть счетчик в его собственном классе одноплодной, затем ссылаться на класс счетчика из A, B и C.

+0

ЭТО! :) Какое изящное и очевидное решение. Я не думаю, что можно сделать это лучше ... Большое спасибо за сохранение моего дня :) –

1

Статические поля зависят на их классе (это то, как C# обрабатывает сообщения, какие статические члены есть), а когда вы передаете другой общий тип, вы эффективно определяете отдельный класс.

Итак, нет. Что-то вроде общего счетчика, вероятно, будет лучше обрабатываться любым классом, который вызывает Thing That Counts, так как это тот класс, который в наибольшей степени будет интересоваться состоянием этого счетчика. Если вы не можете сделать это по какой-либо причине (на этот класс ссылается куча несвязанных потоков), вы можете сделать статический класс для хранения состояния библиотеки, но это вызывает проблемы с тестируемостью, поэтому я бы попытался чтобы избежать этого, если сможете.

+0

Большое спасибо за ваш комментарий :) –

1

Самое простое решение:

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++; 
    } 
} 

firsr вызов GetCounterAndAddOne гравюр 0, второй 1, и это будет продолжаться по мере необходимости

+0

Большое спасибо за ваш комментарий :) –

Смежные вопросы