Подтвердить что ты не робот

Статические поля в базовом классе и производных классах

В базовом классе abstract, если у нас есть несколько полей static, что с ними происходит?

Является ли их областью класс, наследующий этот базовый класс или только тот тип, из которого он наследуется (каждый подкласс имеет собственную копию поля static из базового класса abstract)?

4b9b3361

Ответ 1

Члены

static полностью специфичны для класса объявления; подклассы не получают отдельных копий. Единственным исключением здесь являются дженерики; если открытый общий тип объявляет статические поля, поле специфично для этой точной комбинации аргументов типа, которые составляют закрытый общий тип; т.е. Foo<int> будет иметь отдельные статические поля для Foo<string>, считая, что поля определены на Foo<T>.

Ответ 2

Как указано в другом ответе, статическое поле базового класса будет совместно использоваться всеми подклассами. Если вам нужна отдельная копия для каждого заключительного подкласса, вы можете использовать статический словарь с именем подкласса в качестве ключа:

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