D365F&O扩展类(二)
C#里的扩展类相对简单,可以看做是简单的语法糖。
X++里的扩展类就相对复杂很多,先从最简单的开始,在X++中实现上文在C#中实现的类和方法,代码如下所示:
public class Main { static public void Main(Args _args) { info (new Person().Stage()); } } public class Person { public int Age; } [ExtensionOf(classStr(Person))] final public class Person_Extension{ public str Stage() { if (this.Age <= 18) { return "未成年"; } else { return "成年"; } } }
类定义和调用的方法大同小异,主要是扩展类的定义。
跟C#不同
1.扩展类用的是实例类和实例方法。
2.类用final修饰,也就是说扩展类不能被继承。
3.当前这个扩展类扩展的是哪个类型,用ExtensionOf这个Attribute来指定,而不是像C#一样通过方法的第一个入参用this指定。
X++支持如下类型的扩展:
classstr,
tablestr,
dataentityviewstr,
mapstr,
viewstr
formstr
querystr
要是支持EDT类型的扩展就更好了,EDT类型现有的属性不够用,需要扩展,比如现在str类型的属性只有最大长度,有些情况下可能要限定用户输入必须要固定的位数,real类型的EDT有时候需要限定用户能输入的最大值和最小值,如果支持扩展针对某些EDT类型写一些扩展方法就方便多了。
X++的扩展类还有很多C#的扩展类没有的特性。
因为C#的扩展类是静态类,所以不能有实例方法,也不能扩展属性,而X++的扩展类是实例类,支持属性的扩展,也可以定义静态方法。
public class Main { static public void Main(Args _args) { Person person = new Person(); person.Height = 1.75; person.Weight = 70; info (num2Str(person.BMI(),0 ,2, 0, 0)); Person::Introduce(); } } [ExtensionOf(classStr(Person))] final public class Person_Extension{ public real Height; public real Weight; public static str PersonInfo = "Hello,World!"; public real BMI() { return Weight /(Height * Height); } public static void Introduce() { info (PersonInfo); } }
等于X++的扩展类无所不能可以扩展一切了,直接把属性,方法,静态属性和静态方法都能随便加进去。
C#目前还不能扩展属性,当然它有自己的考虑,这样可以扩展一切的做法,有利有弊,仁者见仁智者见智的事情了,所以C#一直在讨论要不要加上扩展属性。
X++ 作为一种平台语言,可扩展性更加急迫,要不然没法玩,所以直接把扩展一步到位了。
知道了X++扩展类的使用方法,但是它底层具体是怎么实现的呢?
C#是通过静态类和静态方法,第一个入参是被扩展类实例的引用,通过编译器做一下转换,这个很好理解。
X++的扩展类是个实例类,它是怎么把被扩展类的实例传到扩展类的实例方法的呢?扩展类是什么时候实例化的呢?
这个留在下一篇摸索一下。