solidity中合約繼承時(shí),constructor的執(zhí)行形式與其他語言的不同之處

solidity中合約繼承時(shí)構(gòu)造函數(shù)執(zhí)行形式

在solidity中,如果一個(gè)合約Child繼承了合約Parent,那么當(dāng)合約Child在部署時(shí),合約Parent的構(gòu)造函數(shù)會自動執(zhí)行。不需要像其他語言一樣在子類中手動執(zhí)行父類的構(gòu)造函數(shù)。例如如下的合約:

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兩個(gè)變量,發(fā)現(xiàn)其值符合預(yù)期,說明,父合約和子合約的構(gòu)造函數(shù)都被調(diào)用了,并且父合約的構(gòu)造函數(shù)的調(diào)用不需要在子合約中手動執(zhí)行

image.png

如果父合約的構(gòu)造函數(shù)需要接受參數(shù),那么子合約在繼承時(shí)需要傳入。
我們將父合約的構(gòu)造函數(shù)修改一下,代碼如下:

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;
    }
}

這里注意,我們只修改了父合約的構(gòu)造函數(shù),如果直接這樣子部署會報(bào)錯(cuò),部署失敗,因?yàn)樽雍霞s在繼承時(shí)沒有給父合約傳入相應(yīng)的變量,報(bào)錯(cuò)內(nèi)容如下:

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,即子合約在繼承時(shí)傳入的值。

PHP中類繼承時(shí)構(gòu)造函數(shù)執(zhí)行形式

在php中,子類繼承父類后,在子類中需要手動調(diào)用parent::__construct();來執(zhí)行父類的構(gòu)造函數(shù),不然父類的構(gòu)造函數(shù)不會執(zhí)行。
代碼樣例如下:

<?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();

執(zhí)行的輸出結(jié)果是child class。因?yàn)樽⑨屃?code>parent::__construct();,所以父類的構(gòu)造函數(shù)不會執(zhí)行。

js中類繼承時(shí)構(gòu)造函數(shù)執(zhí)行形式

在es6的類繼承中,子類需要在其構(gòu)造函數(shù)中強(qiáng)制調(diào)用super()來執(zhí)行父類的構(gòu)造函數(shù),不然報(bào)錯(cuò),報(bào)錯(cuò)內(nèi)容如下:

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()
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容