导入
继承、抽象合约与接口
学习如何通过引入其他智能合约、抽象合约和接口中的代码来扩展你的智能合约功能。
在面向对象编程中,继承是指一个程序能够使用另一个程序的功能。在 Solidity 中,继承允许我们通过复用已被验证为安全的代码来扩展合约,从而保持代码的组织性和可维护性。提供这些功能的合约称为基合约,而继承该功能的合约则称为派生合约。
我们使用 is 关键字声明一个合约从某个源合约继承,这相当于表示派生合约是基合约的一个实例。
1pragma solidity >=0.4.0 <0.7.0; 2contract X {} 3contract Y is X {} 4contract Z is Y { 5 // 这使得 Z 也继承自 X 6}
1pragma solidity >=0.5.0 <0.9.0; 2contract sum { 3 function computeSum(uint num1, uint num2) internal pure returns(uint) { 4 return num1 + num2; 5 } 6} 7contract product { 8 function computeProduct(uint num1, uint num2) internal pure returns(uint) { 9 return num1 * num2; 10 } 11} 12contract operations is sum, product { 13 uint public mySum; 14 uint public myProduct; 15 function setSum(uint num1, uint num2) external returns(uint) { 16 mySum = computeSum(num1, num2); 17 return mySum; 18 } 19 function setProduct(uint num1, uint num2) external returns(uint) { 20 myProduct = computeProduct(num1, num2); 21 return myProduct; 22 } 23}
1// SPDX-License-Identifier: MIT 2pragma solidity >=0.6.0 <0.9.0; 3abstract contract sumAndProduct{ 4 function computeSum(uint num1, uint num2) internal pure returns(uint) { 5 return num1 + num2; 6 } 7 function computeProduct(uint num1, uint num2) internal virtual pure returns(uint); 8} 9contract operations is sumAndProduct{ 10 uint public mySum; 11 uint public myProduct; 12 function setSum(uint num1, uint num2) external returns(uint) { 13 mySum = computeSum(num1, num2); 14 return mySum; 15 } 16 function computeProduct(uint num1, uint num2) internal override pure returns(uint){ 17 return num1 * num2; 18 } 19 function setProduct(uint num1, uint num2) external returns(uint) { 20 myProduct = computeProduct(num1, num2); 21 return myProduct; 22 } 23}
1// SPDX-License-Identifier: MIT 2pragma solidity >=0.5.0 <0.9.0; 3interface sumAndProduct{ 4 function computeSum(uint num1, uint num2) external pure returns(uint); 5 function computeProduct(uint num1, uint num2) external pure returns(uint); 6} 7contract operations is sumAndProduct{ 8 uint public mySum; 9 uint public myProduct; 10 function computeSum(uint num1, uint num2) public override pure returns(uint){ 11 return num1 + num2; 12 } 13 function setSum(uint num1, uint num2) external returns(uint) { 14 mySum = computeSum(num1, num2); 15 return mySum; 16 } 17 function computeProduct(uint num1, uint num2) public override pure returns(uint){ 18 return num1 * num2; 19 } 20 function setProduct(uint num1, uint num2) external returns(uint) { 21 myProduct = computeProduct(num1, num2); 22 return myProduct; 23 } 24}