Цитата:
Сообщение от
Logger
Да, но кому от этого легче ? Ведь SysExtensionAppClassFactory все равно придется менять.
Да нет же, ни в коем случае! Смысл как раз в том, что каждый статический метод-"фабрика" в базовом классе той или иной иерархии должен знать всех наследников уже во время компиляции - именно поэтому его постоянно приходится менять при добавлении новых наследников. А "фабрика" SysExtension во время компиляции ничего ни про кого не знает - она получает всю необходимую информацию о классах-наследниках во время выполнения, узнает, какое значение какого атрибута сопоставлено какому наследнику, и уже исходя из этого создает экземпляр нужного класса из иерархии для заданного значения атрибута. Эта информация, разумеется, кэшируется, причем в 2012-й появился глобальный кэш на уровне АОСа (т.е. разделяемый между всеми сессиями). Но основной смысл в том, что ни код базового класса, ни код "фабрики" никак не меняется при создании очередного класса-наследника.
Цитата:
Сообщение от
Logger
Цитата:
No change in the public API! The contract stays the same – this is an easy and low risk refactoring.
исходный вариант с конструктором не предполагал изменение API.
Наверно, имеется в виду то, что можно переделать методы-"фабрики" базовых классов таким образом, чтобы они использовали новую инфраструктуру SysExtension вместо явного прописывания всех наследников в своем коде. Правда, для этого надо каждому классу-наследнику повесить соотв. атрибут, но зато вызывающий код никак не изменится - он, условно, как передавал какой-нить енум в статический метод базового класса, так и будет передавать, только этот метод перестанет на этапе компиляции "знать", какой именно класс-наследник окажется создан для того или иного значения енума.