Наследование и статические свойства - PullRequest
8 голосов
/ 23 сентября 2010

Я не понимаю следующее явление, может кто-нибудь объяснить мне, пожалуйста, в чем я ошибся?

public class BaseClass
{
    public BaseClass()
    {
        BaseClass.Instance = this;
    }

    public static BaseClass Instance
    {
        get;
        private set;
    }
}

public class SubClassA : BaseClass
{
    public SubClassA() 
        : base()
    { }
}

public class SubClassB : BaseClass
{
    public SubClassB()
        : base()
    { }
}

class Program
{
    static void Main(string[] args)
    {
        SubClassA a = new SubClassA();
        SubClassB b = new SubClassB();

        Console.WriteLine(SubClassA.Instance.GetType());
        Console.WriteLine(SubClassB.Instance.GetType());

        Console.Read();
    }
}

Как я понял, компилятор должен генерировать новый тип посредством наследования, чтобы SubClassA и SubClassB были действительно собственными типами с собственными статическими переменными. Но кажется, что статическая часть класса не наследуется, а ссылается - что я могу сделать не так?

Ответы [ 3 ]

16 голосов
/ 23 сентября 2010

Существует только одно статическое свойство Instance, и оно определено в BaseClass, что также является единственным типом, который может его изменить (поскольку набор private).

Происходит следующее: каждый из ваших подклассов SubClassA и SubClassB вызывает конструктор BaseClass в своих собственных конструкторах.Этот конструктор устанавливает Instance на инициализируемый экземпляр BaseClass.

Последним таким экземпляром в вашем примере кода является экземпляр SubClassB;следовательно, свойство one Instance будет установлено на этот экземпляр к тому времени, когда вы достигнете своих вызовов Console.WriteLine.

Вы можете полностью изменить построение ваших объектов SubClassA и SubClassBи вы увидите, что Instance будет установлен вместо SubClassA.

12 голосов
/ 23 сентября 2010

Наследование в .NET работает только на базе экземпляров.Статические методы определяются на уровне типа, а не на уровне экземпляра.Вот почему переопределение не работает со статическими методами / свойствами / событиями ...

Статические методы хранятся в памяти только один раз.Для них не создано виртуальной таблицы и т. Д.

Если вы вызываете метод экземпляра в .NET, вы всегда предоставляете ему текущий экземпляр.Это скрыто во время выполнения .NET, но это происходит.Каждый метод экземпляра имеет в качестве первого аргумента указатель (ссылку) на объект, на котором выполняется метод.Этого не происходит со статическими методами (так как они определены на уровне типа).Как компилятор должен выбрать метод для вызова?

0 голосов
/ 23 сентября 2010

Из-за таких проблем классы Singleton должны быть объявлены запечатанными: MSDN Singletons

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...