Как предотвратить появление шаблона Factory Method, вызывающего предупреждение о вызове виртуального члена в конструкторе?

На www.dofactory.com я нашел реальный пример шаблона Factory. Но код генерирует предупреждение в ReSharper о вызове виртуального члена в конструкторе.

Код, вызывающий предупреждение, следующий:

abstract class Document
{
    private List<Page> _pages = new List<Page>();

    // Constructor calls abstract Factory method
    public Document()
    {
        this.CreatePages(); // <= this line is causing the warning
    }

    public List<Page> Pages
    {
        get { return _pages; }
    }

    // Factory Method
    public abstract void CreatePages();
}

class Resume : Document
{
    // Factory Method implementation
    public override void CreatePages()
    {
        Pages.Add(new SkillsPage());
        Pages.Add(new EducationPage());
        Pages.Add(new ExperiencePage());
    }
}

В потребляющем коде вы можете просто использовать:

Document document = new Resume();

Я понимаю, почему вызывать виртуальный член в конструкторе (— плохая идея, как описано здесь).

Мой вопрос заключается в том, как вы можете реорганизовать это, чтобы по-прежнему использовать фабричный шаблон, но без вызова виртуального члена в конструкторе.

Если бы я просто удалил вызов CreatePagesиз конструктора, потребителю пришлось бы явно вызывать метод CreatePages:

Document document = new Resume();
document.CreatePages();

Я гораздо больше предпочитаю ситуацию, когда создание нового Resume— это все, что нужно для фактического создания Резюме, содержащего страницы.

8
задан Community 23 May 2017 в 12:28
поделиться