# solidity-13-可见性

By [面向加薪学习](https://paragraph.com/@0x7f7b198684e3cdb54397438fad4c8442f34b9bd9) · 2023-01-28

---

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**关键字。

---

*Originally published on [面向加薪学习](https://paragraph.com/@0x7f7b198684e3cdb54397438fad4c8442f34b9bd9/solidity-13)*
