什么是x++? x++是微软ERP所使用的内部编程语言,和C系列的语言语法很相似,微软Dynamics AX内嵌的开发语言X++,下面是有关的一些介绍 原文地址:http://url.csai.cn/user1/16236/archives/2006/10476.html 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++不需要处理,也无法处理。 |
|