合约继承是一种使合约代码重用更加容易的方法。通过使用合约继承,可以在新合约中使用已有合约的功能而无需重复编写代码。
以下示例演示如何使用合约继承来创建一个新合约,该合约具有另一个合约的功能。
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.3;
contract Ownable {
address public owner;
constructor() {
owner = msg.sender;
}
modifier onlyOwner() {
require(msg.sender == owner, "must be owner");
_;
}
}
contract SecretVault {
string secret;
constructor(string memory _secret) {
secret = _secret;
}
function getSecret() public view returns (string memory) {
return secret;
}
}
contract MyContract is Ownable {
address private _secretVaultAddress;
string public myString;
constructor(string memory _myString, address secretVaultAddress) {
myString = _myString;
_secretVaultAddress = secretVaultAddress;
}
function getSecret() public view onlyOwner returns (string memory) {
SecretVault secretVault = SecretVault(_secretVaultAddress);
return secretVault.getSecret();
}
}
Ownable
合约定义了一个名为owner
的状态变量和一个修改器onlyOwner
。SecretVault
合约定义了一个名为secret
的状态变量,以及一个返回secret
变量值的函数getSecret
。MyContract
合约继承了Ownable
合约,并使用SecretVault
合约的功能。getSecret
函数首先调用onlyOwner
修改器,然后使用_secretVaultAddress
访问SecretVault
合约,并调用getSecret
函数来检索secret
变量的值。
现在,我们可以使用 Remix 部署 SecretVault
和 MyContract
合约。
然后,通过设置 MyContract
构造函数的参数来创建新的 MyContract
实例。
最后,我们可以调用 MyContract
的 getSecret
函数来检索 SecretVault
的 secret
值。
- 只能从一个合约继承。