美文网首页SAP
你真的会用ABAP, Java和JavaScript里的cons

你真的会用ABAP, Java和JavaScript里的cons

作者: _扫地僧_ | 来源:发表于2018-04-04 19:17 被阅读27次

    如果constructor里调用了一个成员方法,这个方法被子类override了,当初始化一个子类实例时,父类的构造函数被的调用,此时父类构造函数的上下文里调用的成员方法,是父类的实现还是子类的实现?
    你能不用运行代码,就能准确说出这些语句会打印什么出来呢?

    ABAP

    class ZCL_SUPER definition
      public
      create public .
    public section.
      methods CONSTRUCTOR .
      methods SET_I
        importing
          !IV_I type INT4 .
    protected section.
    private section.
      data MV_SUPER type INT4 .
    ENDCLASS.
    CLASS ZCL_SUPER IMPLEMENTATION.
      method CONSTRUCTOR.
        me->set_i( 100 ).
      endmethod.
      method SET_I.
        me->mv_super = iv_i.
      endmethod.
    ENDCLASS.
    class ZCL_SUB definition
      public
      inheriting from ZCL_SUPER
      final
      create public .
    public section.
      methods PRINT .
      methods SET_I
        redefinition .
    protected section.
    private section.
      data MV_SUB type I value 1 ##NO_TEXT.
    ENDCLASS.
    CLASS ZCL_SUB IMPLEMENTATION.
      method PRINT.
        WRITE: / ' sub:' , mv_sub.
      endmethod.
      METHOD set_i.
        super->set_i( iv_i = iv_i ).
        me->mv_sub = iv_i.
        WRITE: / 'mv_sub assigned by: ' , iv_i.
      ENDMETHOD.
    ENDCLASS.
    

    测试:

    NEW zcl_sub( )->print( ).
    

    测试结果:sub: 1

    Java

    public class SuperClass {
    
        private int mSuperX;
    
        public SuperClass() {
            setX(99);
        }
    
        public void setX(int x) {
            mSuperX = x;
        }
    }
    public class SubClass extends SuperClass {
    
        private int mSubX = 1;
    
        public SubClass() {}
    
        @Override
        public void setX(int x) {
            super.setX(x);
            mSubX = x;
            System.out.println("SubX is assigned " + x);
        }
    
        public void printX() {
            System.out.println("SubX = " + mSubX);
        }
    }
    

    test:

    public static void main(String[] args) {
            SubClass sc = new SubClass();
            sc.printX();
        }
    

    测试结果:


    JavaScript

    function SuperClass(){
        this.setX(99);
    }
    
    SuperClass.prototype = {
        mSuperX : 0,
        setX : function(x){
             this.mSuperX = x;
        }
    };
    function SubClass(){  
        SuperClass.call(this);  
        this.mSubX = 1;
    }  
    
    SubClass.prototype = new SuperClass();  
    
    SubClass.prototype.setX = function(x){
            SuperClass.prototype.setX(x);
            this.mSubX = x;
            console.log("SubX is assigned " + x);
    };
    
    SubClass.prototype.print = function(){
        console.log("SubX: " + this.mSubX);
    }
    

    test:

    var sub = new SubClass();
    sub.print();
    

    测试结果:


    详细分析在我的SAP community博客里: A reminder for using constructor in OO world
    要获取更多Jerry的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

    相关文章

      网友评论

      本文标题:你真的会用ABAP, Java和JavaScript里的cons

      本文链接:https://www.haomeiwen.com/subject/osdlhftx.html