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();来执行父类的构造函数,不然父类的构造函数不会执行。
代码样例如下:

<?php

class ParentClass
{
    public function __construct()
    {
        echo "parent constructor" . PHP_EOL;
    }
}
class ChildClass extends ParentClass
{
    public function __construct()
    {
        echo "child class" . PHP_EOL;
//        parent::__construct();
    }
}
$childClass = new ChildClass();

执行的输出结果是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()
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

友情链接更多精彩内容