Cover photo

solidity-13-可见性

public

公开的,表示可以在合约内部和外部调用。都支持外部访问。

private

私有的,表示只能在合约内部调用。

internal

内部的,表示只能在合约内部调用。在0.5版本以后,已经废弃,建议使用private替代。

external

外部的,表示只嗯呢该在外部调用。状态变量不支持external类型。只支持外部函数访问,如果内部函数访问会报错。

对于,public、internal、private的状态变量都支持合约内部函数的访问。

对于,public、internal、private类型的函数都支持合约内部函数的访问。

pragma solidity ^0.8.0;

contract MyContract {
    // 只能在外部调用
    function externalFunction() external {
        //...
    }

    // 可以在合约内部和外部调用
    function publicFunction() public {
        //...
    }

    // 只能在合约内部调用
    function privateFunction() private {
        //...
    }
}

状态变量继承

pragma solidity ^0.8.0;

contract Car{
    string private _name;
    string public _color;
    uint  _kw;

    constructor(){
        _name="car";
        _color="black";
        _kw=0;
    }

    function getKW() view external returns(uint){
        return _kw;
    }

    function getColor() view public returns (string memory){
        return _color;
    }

    function getName() view private returns(string memory){
        return _name;
    }
}

contract Tesla is Car {
    constructor() {
        // _name="tesla";
        _color="red";
        _kw=100;
    }

    function go() public {
        // uint kw=getKW();
        string memory color = getColor();
        // string memory name=getName();
    }
}

getKW()是external可见性,只能从外部调用,所以注释掉报错。 getName()是private可见性,不支持继承,所以注释掉报错。

public、internal类型的状态变量都支持继承,private不支持。 external、public、internal可见性都支持继承,private不支持。

重写-override

pragma solidity ^0.8.0;

contract Car{
    string private _name;
    string public _color;
    uint  _kw;

    constructor(){
        _name="car";
        _color="black";
        _kw=0;
    }

    function getKW() view external returns(uint){
        return _kw;
    }

    function getColor() view public virtual returns (string memory){
        return _color;
    }

    function getName() view private returns(string memory){
        return _name;
    }
}

contract Tesla is Car {
    constructor() {
        // _name="tesla";
        _color="red";
        _kw=100;
    }

    function getColor() view public override returns (string memory){
        return _color;
    }
}

如果父合约支持子合约继承自己的行为,也就是函数,那么给函数前面添加virtual关键字。 子合约继承或重写行为的时候,要加上override关键字。