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

如果父合約的構(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)容如下:

修改完成之后的代碼如下:
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()