函数
函数修饰符
function <function name> (<parameter types>) {internal|external|public|private} [pure|view|payable|virtual|override|Modifier] [returns (<return types>)]
- internal:未公开的函数,只能在合约内部使用,不能通过 abi直接/外部调用,允许在继承的子合约中使用
- external:公开的函数,可以通过 abi直接调用,也可以在本合约内通过 this.func 调用,允许在继承的子合约中使用
- public:公开的函数,可以通过 abi直接调用,允许在继承的子合约中使用
- private: 未公开的函数,只能在合约内部使用,不允许通过 abi直接调用,不允许在继承的子合约中使用
- pure: 只读,函数只能读取局部变量
- view: 只读,函数可以读取状态变量、局部变量、全局变量
- payable: payable修饰符表明函数支持接收NativeToken(msg.value!=0)
- virtual: 虚函数,表明函数允许重载修改内部逻辑, 多用于接口合约
- override: 重载函数,重新定义函数内部逻辑,但是函数 selector必须保持一致(函数名称、函数参数类型和数量)
- Modifier: 修饰器,内部定义条件判断, 允许在继承的子合约中使用
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.26;
contract parentOne {
    uint256 public oneValue;
    function OneInternal() internal virtual {
        oneValue += 1;
    }
    function OneExternal() external virtual {
        oneValue += 2;
    }
    function OnePublic() public virtual {
        oneValue += 3;
    }
    function OnePrivate() private {
        oneValue += 4;
    }
}
contract functionsChecker is parentOne {
    function addOne() external {
        OneInternal();
    }
    // function addTwo() external {
    //     this.OneExternal();
    // }
    function addThree() external {
        super.OnePublic(); // super调用最近继承者合约的内部函数, +3
    }
    // function addFive() external {
    //     OnePublic(); //调用本合约的函数,+ 5
    // }
    function OnePublic() public virtual override {
        //重写函数,修改函数逻辑
        oneValue += 5;
    }
    //receive() external payable {}
}