ethereum(以太坊)(三)--合约单继承与多继承

Posted on 2018-11-13 14:11  eilinge  阅读(396)  评论(0编辑  收藏  举报
pragma solidity ^0.4.0;

// priveta public internal

contract Test{
    //defualt internal
    uint8 internal _money;
    uint8 _age;
    uint8 private _height;
    uint8 public _sex;
    
    function test() constant returns(uint8){
        return _money;
    }
    
    function testAge() constant returns(uint8){
        return _age;
    }
    
    function testHeight()constant returns(uint8){
        return _height;
    }
    
    function testSex() constant returns(uint8){
        return _sex;
    }
    
    function testSex1() external returns(uint8){
        return 10;
    }
    
    function testAddress1() constant returns(address){
        return msg.sender; //0xca35b7d915458ef540ade6068dfe2f44e8fa733c
    }

}

contract Test1{
    uint _mouth;
    function Test1(){
        _mouth = 11;
    }
    function mouth() returns(uint){
        return _mouth;
    }
}

contract SubTest is Test,Test1{
    
    function testAddress2()constant returns(address){
        return msg.sender;//0xca35b7d915458ef540ade6068dfe2f44e8fa733c
    }
    function testInternel1()constant returns(uint8){
        return _money;
    }
    function testInternel2()constant returns(uint8){
        return _age;
    }
    /*DeclarationError: Undeclared identifier
    function testPrivate() returns(uint8){ //cannot call Private function/attribute
        return _height;
    }
    */
    function testPublic()constant returns(uint8){
        return _sex;
    }
    function testExternal()constant returns(uint8){
        return this.testSex1();
        //return this.testSex1; TypeError: Return argument type function () external returns (uint8) 
        //is not implicitly convertible to expected type (type of first return variable) uint8
        //return testSex1; DeclarationError: Undeclared identifier
    }
    
    function mouth() returns(uint){
        return 100; //Rewriting the Mouth function in the subcontract overrides the value written by the parent function,only Public function can be overrided
    }
}
public
    1.public类型的状态变量和函数的权限最大,可供外部、子合约、合约内部访问。
    2.状态变量声明时,默认为internal类型,只有显示声明为public类型的状态变量才会自动生成一个和状态变量同名的get函数以供外部获取当前状态变量的值。
    函数声明时默认为public类型,和显示声明为public类型的函数一样,都可供外部访问。

internal
    1.internal类型的状态变量可供外部和子合约调用。
    2.子合约中能继承父合约中的所有的public/external类型的函数,不能继承private的函数,也无法调用;internal无法继承,可以调用
private 1.private私有类型,只能在本合约内部使用,所以在子合约中尝试使用时,就会报错。 
external
  1.子合约调用父合约中的external函数时,可以用this.
testSex1()/testSex1()
重写
    子合约可以将父合约的public类型的函数,只能继承public类型的函数,继承过来的函数进行重写(父函数不是只读属性(constant))
   //https://pan.baidu.com/s/1cRICAY9aSHn6vNI4YN1tQQ