• 你真的会用ABAP, Java和JavaScript里的constructor么?


    如果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的原创技术文章,请关注公众号"汪子熙"或者扫描下面二维码:

  • 相关阅读:
    BeanUtils在web项目中的应用
    BeanUtils的日期问题
    使用BeanUtils组件
    调用数据库过程函数mysql
    sql注入
    如何取SO中的特性
    Read config detail from SO
    Parts-Ufida ERP project 1
    常用医疗英语
    April 24th 2020
  • 原文地址:https://www.cnblogs.com/sap-jerry/p/8724238.html
Copyright © 2020-2023  润新知