El SysExtension Framework es incorporado en Dynamics AX para solventar el diseño de extensión de clases (jerarquías). En el siguiente ejemplo motraremos el uso de esta solución.
Espero sea de su ayuda.
1. Lo primero que necesitamos es un diseño de jerarquía de clases. De manera sencilla, para este ejemplo se crearán las clase HACustInvoice y HACustInvoice_Sales.
class HACustInvoice
{
}
public void run()
{
info("clase HACustInvoice");
}
class HACustInvoice_Sales extends HACustInvoice
{
}
public void run()
{
info("clase HACustInvoice_Sales");
//super();
}
2. Ahora, creamos una clase que extiende de SysAttribute. Donde definiremos el atributo que en el contructor nos retorne la clase derivada.
Esta clase almacena un valor recibido por parámetros y lo devuelve por un método parm.
class HACustInvoiceTypeAttribute extends SysAttribute
{
str classType;
}
public void new(str _classType)
{
super();
if(_classType == "")
throw error(error::missingParameter(this));
classType = _classType;
}
public str parmClassType(str _classType = classType)
{
classType = _classType;
return classType;
}
3. Editamos la classDeclaration de la clase (HACustInvoice_Sales)derivada para añadir este atributo.
[HACustInvoiceTypeAttribute("Sales")]
class HACustInvoice_Sales extends HACustInvoice
{
}
4. Por ultimo, editamos el constructor de la clase HACustInvoice con una nueva definición que utilice el atributo de la clase derivada.
public static HACustInvoice construct(str _classType)
{
HACustInvoiceTypeAttribute custInvoiceTypeAttribute;
HACustInvoice custInvoice;
custInvoiceTypeAttribute = new HACustInvoiceTypeAttribute(_classType);
custInvoice = SysExtensionAppClassFactory::getClassFromSysAttribute(classStr(HACustInvoice),
custInvoiceTypeAttribute);
return custInvoice;
}
Segun éste diseño, no tendremos que modificar en absoluto nuevamente el constructor para añadir nuevas clases derivadas. Bastaría con indicar un nuevo atributo en la declaración de las nuevas clases derivadas.
5. Ejecutamos nuestro ejemplo de la siguiente manera:
static void JobHMAE(Args _args)
{
HACustInvoice custInvoice;
custInvoice = HACustInvoice::construct("Sales");
custInvoice.run();
}