Skip to content

Latest commit

 

History

History
71 lines (50 loc) · 2.44 KB

23 继承.md

File metadata and controls

71 lines (50 loc) · 2.44 KB

继承(Inheritance)

合约继承是一种使合约代码重用更加容易的方法。通过使用合约继承,可以在新合约中使用已有合约的功能而无需重复编写代码。

以下示例演示如何使用合约继承来创建一个新合约,该合约具有另一个合约的功能。

// 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 部署 SecretVaultMyContract 合约。

inheritance-remix

然后,通过设置 MyContract 构造函数的参数来创建新的 MyContract 实例。

inheritance-deploy-mycontract-remix

最后,我们可以调用 MyContractgetSecret 函数来检索 SecretVaultsecret 值。

inheritance-get-secret-remix

注意

  • 只能从一个合约继承。