Статические поля в базовом классе и производных классах - PullRequest
40 голосов
/ 02 мая 2011

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

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

Ответы [ 2 ]

66 голосов
/ 02 мая 2011

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

10 голосов
/ 20 августа 2015

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

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;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...