solidity中合约继承时,constructor的执行形式与其他语言的不同之处

solidity中合约继承时构造函数执行形式

在solidity中,如果一个合约Child继承了合约Parent,那么当合约Child在部署时,合约Parent的构造函数会自动执行。不需要像其他语言一样在子类中手动执行父类的构造函数。例如如下的合约:

pragma solidity ^0.5.4;

contract Parent {
    uint256 public parentNum;

    constructor() internal {
        parentNum = 100;
    }
}

contract Child is Parent {
    uint256 public childNum;
    constructor() public {
        childNum = 200;
    }
}

部署完成之后,检查parentNumchildNum两个变量,发现其值符合预期,说明,父合约和子合约的构造函数都被调用了,并且父合约的构造函数的调用不需要在子合约中手动执行

image.png

如果父合约的构造函数需要接受参数,那么子合约在继承时需要传入。
我们将父合约的构造函数修改一下,代码如下:

pragma solidity ^0.5.4;

contract Parent {
    uint256 public parentNum;

    constructor(uint256 _parentNum) internal {
        parentNum = _parentNum;
    }
}

contract Child is Parent {
    uint256 public childNum;
    constructor() public {
        childNum = 200;
    }
}

这里注意,我们只修改了父合约的构造函数,如果直接这样子部署会报错,部署失败,因为子合约在继承时没有给父合约传入相应的变量,报错内容如下:

image.png

修改完成之后的代码如下:

pragma solidity ^0.5.4;

contract Parent {
    uint256 public parentNum;

    constructor(uint256 _parentNum) internal {
        parentNum = _parentNum;
    }
}

contract Child is Parent(101) {
    uint256 public childNum;
    constructor() public {
        childNum = 200;
    }
}

部署完成之后父合约的parentNum变量为101,即子合约在继承时传入的值。

PHP中类继承时构造函数执行形式

在php中,子类继承父类后,在子类中需要手动调用parent::__construct();来执行父类的构造函数,不然父类的构造函数不会执行。
代码样例如下:

执行的输出结果是child class。因为注释了parent::__construct();,所以父类的构造函数不会执行。

js中类继承时构造函数执行形式

在es6的类继承中,子类需要在其构造函数中强制调用super()来执行父类的构造函数,不然报错,报错内容如下:

ReferenceError: Must call super constructor in derived class before accessing 'this' or returning from derived constructor

测试代码如下:

class Parent {
  constructor () {
    console.log('parent class')
  }
}

class Child extends Parent {
  constructor () {
    super()
    console.log('child class.')
  }
}

const child = new Child()

你可能感兴趣的:(solidity中合约继承时,constructor的执行形式与其他语言的不同之处)