Solidity 多重继承的构造函数

Solidity 多重继承的构造函数有两种形式:

1. 已知基类初始化参数

如果我们已经知道基类初始化参数,那么就可以在派生类的继承声明中,直接传递参数给基类的构造函数。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract X {
   string public name;
   constructor(string memory _name) {
      name = _name;
   }
}

contract Y {
   string public value;
   constructor(string memory _value) {
      value = _value;
   }
}

// 派生类的继承声明中,直接传递参数给基类的构造函数
contract Z is X("n"),Y("v") {
}

2. 部署时传递初始化参数

如果我们需要在部署时或者运行时,由调用方传递基类初始化参数。在这种情况下,我们需要编写一个新的构造函数,传递参数给基类。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract X {
   string public name;
   constructor(string memory _name) {
      name = _name;
   }
}

contract Y {
   string public value;
   constructor(string memory _value) {
      value = _value;
   }
}

// 编写一个新的构造函数,传递参数给基类
contract Z is X,Y {
   constructor(string memory _name, string memory _value) X(_name) Y(_value){
   }
}

3. 混写方式

我们可以同时使用上面的两种方式,定义和部署时,分别传递参数给基类的构造函数。

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

contract X {
   string public name;
   constructor(string memory _name) {
      name = _name;
   }
}

contract Y {
   string public value;
   constructor(string memory _value) {
      value = _value;
   }
}

// 混写方式
contract Z is X("n"),Y {
   constructor(string memory _value) Y(_value){
   }
}

4. 继承顺序

多重继承中,构造函数的执行会按照定义时的继承顺序进行,与构造函数中定义顺序无关。

例如:

contract Z is X,Y {
   // 会按照继承顺序X,Y,先执行X的构造函数,再执行Y的构造函数,最后执行Z的构造函数
   constructor() Y("v"), X("n"){
       // 先运行 X("n"),再运行 Y("v")
   }
}

下一章:Solidity 调用父类函数

Solidity 派生类调用父类函数有两种方法:使用父级合约名称调用使用super调用使用父级合约名称调用使用父级合约名称调用,格式为:<parent contract>.<method&g ...