初学Dynamics AX -> X++
X++语言特性 X++是Axapta MorphX的开发语言,它也是一种面向对象的开发语言。由于Axapta是一套ERP平台,使得用X++进行ERP业务的二次开发变得非常简单。与其它面向对象的语言不同,X++具有一些自己的特性。
1、 Class Variables
X++ 的类级别变量都是protected型的,也就是说,无法从类的外部访问这些变量。在子类中可以访问父类的类级别变量。如果非要从外部访问类级别变量,可以使用parm类型的方法来实现,这种方法在系统中被广泛使用。例如,在某个类的classDeclaration中定义了一个int类型的类级别变量 value,那么就可以在该类中定义如下的方法来实现对value的修改与访问:
int parmMyValue (int _value = value)
{
value = _value;
return value;
}
2、 类的静态成员变量
与其它面向对象开发语言不同,无法在X++中定义类的静态成员变量,但可以在X++的类中定义静态方法。要想在类的静态方法中访问类级别变量,只能够通过parm类型的方法和实例传递策略来实现,例如某个类的定义如下:
class StaticTest
{
int value;
}
static void StaticMethod(StaticTest _tester)
{
if (_tester)
{
// 使用实例传递策略来访问类级别变量
print _tester.parmMyValue();
}
}
int parmMyValue(int _value = value)
{
value = _value;
return value;
}
void instanceMethod()
{
print value;
}
那么可以使用下面的方法来调用类的静态方法和实例方法:
static void Job1(Args _args)
{
StaticTest tester = new StaticTest();
;
tester.parmMyValue(123);
tester.instanceMethod();
StaticTest::StaticMethod(tester);
pause;
}
3、 多态
多态是一个面向对象的概念,它的具体形式是函数重载(overload),这和函数重写(override)是两个完全不同的概念。X++具备 override,但不支持overload。也就是说,无法在一个类里面定义多个名称相同但参数列表不同的函数。X++支持一种退化的 overload,就是函数的默认参数。系统中很多类的成员方法都有类似下面的定义:
void myFunction (int a, int b, boolean c = false);
那么在调用该方法的时候,第三个参数可以不指定,在这种情况下,c的值会使用默认值(false)
4、 成员可见性
严格地说,X++并不完全遵守面向对象的思想。在面向对象思想中,类的所有成员在默认情况下都是私有的,除非设计师使用public关键字将其定义为公有。这样做是为了达到“严格封装类的信息,只向外发布需要的信息”这一目的(注:C++中当使用struct定义类时,情况正好相反,因为它需要与C语言兼容),也是遵循面向对象基本思想的一个重要体现。然而,X++在默认情况下,类级别变量的可见性都是protected的(如上所述),而方法的可见性都是public的。因此,单纯从面向对象的角度去考察X++语言可以发现,X++的定义并不规范。当然,这也是由于X++本身的应用特性所决定的,因为它是一种ERP二次开发语言。比如为了方便起见, Table型变量的所有字段都是public可见的。
5、 平台开发
X++支持 Axapta ERP平台开发,不支持OS级别的平台开发。例如X++虽然有线程模型,但其主要作用是分离UI和Domain logic,使得在进行业务处理的时候不会造成UI的冻结。典型的例子就是Axapta AOT的“Find”对话框,它会在Find的过程中及时更新用户界面信息。此外,虽然X++提供Windows API、DLL、COM等的编程接口,但要实现OS底层的处理仍然不是一件容易的事情。假设需要为Windows开发一套实时的内存管理系统,X++绝对不是最好的选择。
6、 模式应用
面向对象思想的精髓在于模式应用。X++的语言特性决定了其模式应用也会与其它面向对象语言产生偏差。例如,由于无法定义类的静态成员变量,要在X++中实现单身(Singleton)模式,只能通过使用infolog.globalCache方法来保存类的实例。工厂(Factory)模式在X++中使用的非常广泛,比如SalesFormLetter类的construct方法本身就是一个工厂方法,X++也提供了一个classFactory以生成对应的类的实例。在模式应用上,X++可以处理大多数静态模式,而对于并发与网络化对象模式,X++不需要处理,也无法处理。