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

  • 相关阅读:
    上海电信 华为HG8240R 光猫 破解
    RedSn0w 0.9.10b5 越狱iphone 4 ios 5.0.1 Cydia闪退解决
    用IIS 7.5 Express代替IIS和开发工具vs自带的ASP.NET Development Server
    远程桌面连接问题
    Enterprise Library 5.0 Hands On Lab(1):数据访问程序块(一)
    [Havok] Havok Physics物理引擎的学习入门
    [设计模式] 深入浅出单实例Singleton设计模式(Java版)
    [C#] MD5 加密的具体流程
    [轻音乐] 理查德·克莱德曼专辑[8CD]
    [SEO] [DeDe]优化SEO
  • 原文地址:https://www.cnblogs.com/Farseer1215/p/12772075.html
Copyright © 2011-2022 走看看