Вызов переопределенного метода из базового конструктора - PullRequest
0 голосов
/ 01 января 2011

У нас есть такой класс:

class LogAnalyzer
    {
        protected IExtensionManager manager;

        public  LogAnalyzer()
        {
            GetManager();
        }

        protected virtual void GetManager()
        {
            manager = new FileExtensionManager();
        }
    }

И мы получаем другой класс, подобный этому:

class TestableLogAnalyzer:LogAnalyzer
    {
        protected override void GetManager()
        {
            this.manager = new StubExtensionManager();
        }
    }

Когда мы создаем дочерний класс, что должно происходить в правилах ООП?Виртуальный или переопределенный метод вызывается и почему?Я проверил это в C # и переопределенный метод работал, но я подозреваю, что это может быть наоборот в интерпретируемом языке.Это правда?

Ответы [ 2 ]

1 голос
/ 01 января 2011

Поскольку это не зависит от языка, я буду использовать C ++ в качестве основы и буду надеяться, что этот совет можно экстраполировать.

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

В вашем случае производный класс хочет повлиять на инициализацию своего базового класса. Переопределение виртуальных методов - не единственный способ сделать это. Вы можете создать еще один конструктор, который принимает менеджер, производные классы будут передавать "new StubExtensionManager ();".

1 голос
/ 01 января 2011

Не просто дать независимый от языка ответ на этот вопрос, потому что «что произойдет» зависит от самого языка.Например, в Java будет вызываться переопределенный (виртуальный) метод, но он может создавать свои собственные проблемы и поэтому не рекомендуется.

Вам необходимо обратиться к документации или языковой спецификации, которая вас интересует, а затем прочитайте, чтобы узнать, опубликовал ли кто-то свое мнение о том, почему вы должны или не должны этого делать, и что может пойти не так, например, статья Скотта Мейерса, на которую АраК ссылается в своем комментарии.

...