3分钟Solidity: 4.13 可见性

24 阅读2分钟

如需获取本内容的最新版本,请参见 Cyfrin.io 上的Visibility(代码示例)

函数和状态变量必须声明它们是否可被其他合约访问。函数可以被声明为:

  • public(公开)—— 任何合约和账户均可调用

  • private(私有)—— 仅在定义该函数的合约内部可调用

  • internal(内部)—— 仅在继承该内部函数的合约内部可调用

  • external(外部)—— 仅其他合约和账户可调用

状态变量可被声明为 publicprivateinternal,但不能声明为 external

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

contract Base {
    // 私有函数只能在此合约内部调用
    // 继承此合约的合约无法调用此函数。
    function privateFunc() private pure returns (string memory) {
        return "私有函数调用";
    }

    function testPrivateFunc() public pure returns (string memory) {
        return privateFunc();
    }

    // 内部函数可以在以下情况被调用
    // - 在本合约内部
    // - 在继承本合约的其他合约内部
    function internalFunc() internal pure returns (string memory) {
        return "internal function called";
    }

    function testInternalFunc() public pure virtual returns (string memory) {
        return internalFunc();
    }

    // 公共函数可以被调用
    // - 在本合约内部
    // - 在继承该合约的合约内部
    // - 由其他合约和账户调用
    function publicFunc() public pure returns (string memory) {
        return "public function called";
    }

    // 外部函数只能被其他合约和账户调用
    function externalFunc() external pure returns (string memory) {
        return "external function called";
    }

    // 这个函数无法编译,因为我们试图在这里调用一个外部函数。
    // function testExternalFunc() public pure returns (string memory) {
    //     return externalFunc();
    // }

    // 状态变量
    string private privateVar = "my private variable";
    string internal internalVar = "my internal variable";
    string public publicVar = "my public variable";
    // 状态变量不能是外部的,因此这段代码无法编译。
    // string external externalVar = "my external variable";
}

contract Child is Base {
    // 继承的合约无法访问私有函数和状态变量。
    // function testPrivateFunc() public pure returns (string memory) {
    //     return privateFunc();
    // }

    // 内部函数可以在子合约中调用。
    function testInternalFunc() public pure override returns (string memory) {
        return internalFunc();
    }
}

Remix Lite 尝试一下

solidity-visibility


END