Цитата:
Сообщение от
skuull
Атрибуты решают вполне конкретную задачу - добавление нового класса в иерархию без изменения родительского класса, что особенно актульно в 7ке, т.к. не надо оверлеить.
Паттерны из GoF и подобная литература решает конкретную задачу в программировании и очень жалко что по историческим причинам в АХ попадают люди предпочитающие методы по 2000 строк потому что "все в 1 месте, так удобней" и отрицающие все что "не как в 4ке". Выглядит как-то так

А кто сказал, что в 4-ке нельзя сделать иерархию
без изменения родительского класса?
Создаём базовый класс:
X++:
public class PPO_Base
{
}
protected void new()
{
}
public str getType()
{
return "Base";
}
public static PPO_Base construct(IdentifierName _className = classstr(PPO_Base))
{
DictClass dictClass = new DictClass(classname2id(_className));
;
if (!dictClass)
throw error(strfmt("Unable to instantiate \"%1\" class", _className));
return dictClass.makeObject();
}
public static void main(Args _args)
{
IdentifierName className = _args ? _args.parm() : classstr(PPO_Base);
PPO_Base instance = PPO_Base::construct(className);
;
info(strfmt("Class type: %1", instance.getType()));
}
А потом делаем сколько угодно наследников:
X++:
public class PPO_Derived extends PPO_Base
{
}
public str getType()
{
return "Derived";
}
Создаем менюайтемы для каждого класса. В строковом параметре пишем имя класса. (Для базового класса параметр может быть пустым). Если сильно надо, можно создать енум для иерархии, но необходимости нет, имхо.
Как использовать в коде:
X++:
PPO_Base base = PPO_Base::construct();
PPO_Base derived = PPO_Base::construct(classstr(PPO_Derived));
;
info(strfmt("Base class type: %1", base.getType()));
info(strfmt("Derived class type: %1", derived.getType()));