如需获取本内容的最新版本,请参见 Cyfrin.io 上的Visibility(代码示例)
函数和状态变量必须声明它们是否可被其他合约访问。函数可以被声明为:
-
public(公开)—— 任何合约和账户均可调用 -
private(私有)—— 仅在定义该函数的合约内部可调用 -
internal(内部)—— 仅在继承该内部函数的合约内部可调用 -
external(外部)—— 仅其他合约和账户可调用
状态变量可被声明为 public、private 或 internal,但不能声明为 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 尝试一下
END