Solidity 多重继承

Solidity 语言提供了对合约继承的支持,而且支持多重继承。

Solidity 语言的多重继承采用线性继承方式。继承顺序很重要,判断顺序的一个简单规则是按照“最类似基类”到“最多派生”的顺序指定基类。

第一种情况:基类 X,Y 没有继承关系,派生类 Z 继承了 X,Y。

X  Y
/  \
\  /
 Z

多重继承示例

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract X{
   function x() external pure returns(string memory) {
      return "x";
   }
}

contract Y{
   function y() external pure returns(string memory) {
      return "y";
   }
}

contract Z is X,Y{
   function z() external pure returns(string memory) {
      return "z";
   }
}

派生合约 Z 继承了 X 的 x() 和 Y 的 y(),另外还定义了自己的函数 z()。

第二种情况:派生类 Y 继承了基类 X,派生类 Z 同时继承了 X,Y。

  X 
/   \
Y   |
\   /
  Z

这种情况下,我们按照线性继承原则,理清继承顺序:X,Y,Z。

多重继承示例

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;
contract X{
   function foo() external pure virtual returns(string memory) {
      return "x foo";
   }

   function bar() external pure virtual returns(string memory) {
      return "x bar";
   }

   function x() external pure returns(string memory) {
      return "x";
   }
}

contract Y is X{
   function foo() external pure virtual override returns(string memory) {
      return "y foo";
   }

   function bar() external pure virtual override returns(string memory) {
      return "y bar";
   }

   function y() external pure returns(string memory) {
      return "y";
   }
}

contract Z is X,Y{
   function foo() external pure override(X,Y) returns(string memory) {
      return "y foo";
   }

   function bar() external pure override(X,Y) returns(string memory) {
      return "z bar";
   }

   function z() external pure returns(string memory) {
      return "z";
   }
}

按照线性继承顺序,Z 继承了 Y,Y 继承了X,那么 Z 的写法是 Z is X,Y。如果写成 Z is Y,X,编译器就会报错。

Z 的方法 foo() ,覆盖了 X 和 Y 的方法 foo() ,所以需要写为 override(X,Y)。

   X 
 /   \
Y     A
|     |
|     B
 \   / 
   Z

这种情况下,我们按照线性继承原则,理清继承顺序:X,Y,A,B,Z。

Solidity 多重继承的构造函数有两种形式:1. 已知基类初始化参数如果我们已经知道基类初始化参数,那么就可以在派生类的继承声明中,直接传递参数给基类的构造函数。// SPDX-License-Id ...