Здравствуйте, vmpire, Вы писали:
V>Здравствуйте, samius, Вы писали:
V>>>Виртуальными свойствами или методами. В шарпе их можно вызывать из конструктора.
S>>Можно, но не нужно. Безопасно это можно сделать только в конструкторе sealed класса.
V>Да, вызывать виртуальные методы потомков sealed-класса — это круто 
Про потомков я не говорил ни слова
V>А что значит "безопасно"? Поля производного класса не будут проинициализированы в его конструкторе? Да, не будут и при написании вызовов виртуальных методов из конструктора это нужно учитывать. Но той опасности, которая была в C++ тут не будет согласно стандарту языка C#.
Вот и получается, что когда из конструктора базового класса вызываются виртуальные методы, то производные классы обрастают дополнительными контрактами по поводу того, как именно им нужно перекрывать виртуальные методы, к чему можно обращаться, а к чему — нет. И речь не только о полях производного класса, а и о всех его методах, которые могут обращаться к полям. Все эти методы будут работать во время конструктора не так, как они будут работать после вызова конструктора производного класса.
О специфике виртуальных методов, вызываемых из конструктора базового класса, надо помнить не только при написании производных классов, а так же при рефакторинге. И если у меня в проекте 15Мб исходников, то мне помнить о таких дополнительных соглашениях некоторых классов довольно проблематично. А делать себе и коллегам пометки в коде "если обратишься к полю — ССЗБ" как-то несолидно.