|
![]() |
#1 |
Участник
|
Цитата:
Сообщение от skuull
![]() Атрибуты решают вполне конкретную задачу - добавление нового класса в иерархию без изменения родительского класса, что особенно актульно в 7ке, т.к. не надо оверлеить.
Паттерны из GoF и подобная литература решает конкретную задачу в программировании и очень жалко что по историческим причинам в АХ попадают люди предпочитающие методы по 2000 строк потому что "все в 1 месте, так удобней" и отрицающие все что "не как в 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()));
__________________
// no comments |
|
|
За это сообщение автора поблагодарили: macklakov (1), skuull (2), ax_mct (3), ta_and (4), Logger (1). |
![]() |
#2 |
Участник
|
Цитата:
А в этой реализации было бы неплохо проверить, что _className являеться наследником базовго класса и getType() у вас вышел какой-то бесполезный, только инфо показывать ![]() |
|
![]() |
#3 |
Участник
|
Цитата:
Сообщение от skuull
![]() А кто сказал что нельзя? Я сказал что не принято. Оно ж примерно на атрибутах так и работает, просто ненадо свой конструктор каждый раз писать.
А в этой реализации было бы неплохо проверить, что _className являеться наследником базовго класса и getType() у вас вышел какой-то бесполезный, только инфо показывать ![]()
__________________
// no comments |
|
![]() |
#4 |
Участник
|
|
|
|
За это сообщение автора поблагодарили: ax_mct (3). |
![]() |
#5 |
Участник
|
А зачем вам Args, если требуется только создать нужный инстанс?
__________________
// no comments |
|
![]() |
#6 |
Участник
|
|
|
![]() |
#7 |
Участник
|
Цитата:
X++: public static void main(Args _args) { IdentifierName className = _args ? _args.parm() : classstr(PPO_Base); PPO_Base instance = PPO_Base::construct(className); ; instance.parmRecord(_args.record()); // а так можно? instance.parmArgs(_args); // или вот так? info(strfmt("Class type: %1", instance.getType())); }
__________________
// no comments Последний раз редактировалось dech; 16.07.2017 в 17:14. |
|
|
За это сообщение автора поблагодарили: macklakov (5). |
Теги |
sysextension framework, sysoperation framework, как правильно, полезное |
|
|