• 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++的扩展类是个实例类,它是怎么把被扩展类的实例传到扩展类的实例方法的呢?扩展类是什么时候实例化的呢?
    这个留在下一篇摸索一下。

  • 相关阅读:
    android开发:退出程序(对话框、两次返回键退出)
    【转】将HTML5封装成android应用APK 文件若干方法
    Linux语言修改
    Oracle用户常用数据字典
    成本控制:Oracle 优化器内幕
    [转]oraclemerge用法详解
    Show [SQL*Plus]
    【转】cron
    修改Linux主机名
    表空间删除
  • 原文地址:https://www.cnblogs.com/Farseer1215/p/12772075.html
Copyright © 2020-2023  润新知