توابع و متغیرهای حالت باید اعلام کنند که آیا توسط قراردادهای دیگر قابل دسترسی هستند یا خیر.
توابع را می توان به عنوان اعلام کرد
عمومی
- هر قرارداد و حسابی می تواند تماس بگیردخصوصی
- فقط در داخل قراردادی که عملکرد را تعریف می کنددرونی؛ داخلی
- فقط درون قراردادی که ارث می برد درونی؛ داخلی
تابعخارجی
- فقط قراردادها و حساب های دیگر می توانند تماس بگیرندمتغیرهای حالت را می توان به صورت اعلام کرد عمومی
، خصوصی
، یا درونی؛ داخلی
اما نه خارجی
.
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.24;
contract Base {
// Private function can only be called
// - inside this contract
// Contracts that inherit this contract cannot call this function.
function privateFunc() private pure returns (string memory) {
return "private function called";
}
function testPrivateFunc() public pure returns (string memory) {
return privateFunc();
}
// Internal function can be called
// - inside this contract
// - inside contracts that inherit this contract
function internalFunc() internal pure returns (string memory) {
return "internal function called";
}
function testInternalFunc() public pure virtual returns (string memory) {
return internalFunc();
}
// Public functions can be called
// - inside this contract
// - inside contracts that inherit this contract
// - by other contracts and accounts
function publicFunc() public pure returns (string memory) {
return "public function called";
}
// External functions can only be called
// - by other contracts and accounts
function externalFunc() external pure returns (string memory) {
return "external function called";
}
// This function will not compile since we're trying to call
// an external function here.
// function testExternalFunc() public pure returns (string memory) {
// return externalFunc();
// }
// State variables
string private privateVar = "my private variable";
string internal internalVar = "my internal variable";
string public publicVar = "my public variable";
// State variables cannot be external so this code won't compile.
// string external externalVar = "my external variable";
}
contract Child is Base {
// Inherited contracts do not have access to private functions
// and state variables.
// function testPrivateFunc() public pure returns (string memory) {
// return privateFunc();
// }
// Internal function can be called inside child contracts.
function testInternalFunc() public pure override returns (string memory) {
return internalFunc();
}
}