通学智能合约系列(十六)--合约的继承

大家好,这里是通学技术,欢迎大家继续跟我一起学习智能合约系列。

13、面向对象–合约的继承

相信能看到这里的人,想必都是有经验的开发人员了,坚持不懈,耐得住寂寞。

solidity作为一种图灵完备的面向对象的编程语言,必然同其他面向对象的语言一样,拥有继承这一特性。

我们就主要来看看它是怎么来表示继承的吧!

pragma solidity ^0.4.16;


contract Father{
    
    uint money = 10000;
    
    function noSmoking() public returns(string){
        return "I'm not somking";
    }
    
}


contract Son is Father{
    
    function getMoney() returns(uint){
        return money;
    }
}

关于solidity的继承很简单,语法便是:儿子是父亲

我们分别部署父亲合约和儿子合约,执行后则可得到如下结果:

在这里插入图片描述

我们可以看出,我父亲的钱就是我的钱。(以后有遗产税,可就不能这么说了哈)。我爸爸不抽烟,我继承了我爸爸的意志,也不抽烟。

关于继承,就介绍到这里哈。

14、对象的连续继承

为了简化学习成本,这里不做过多描述,我们的solidity和其他高级语言类似,继承特性是支持传递的。

这里面包含了合约的属性和合约的行为。也就是说,我爷爷的是我爸爸的,也是我的。

15、遗传特性–继承中的权限

我们应该都学过,鲁迅先生的《拿来主义》这篇文章吧,对于继承,我们也应当有这种不能全盘否定,也不能照单全收的想法,那么怎么做到有的放矢呢?我们可以通过权限来控制。

爸爸的优点,我们要继承,爸爸的恶习,我们当然要拒绝。

pragma solidity ^0.4.16;


contract Father{
    // 爸爸的私房钱 不可以被继承
    uint private privateMoney = 2000;
    
    // 可以被继承
    // uint privateMoney = 2000;
    // uint public privateMoney = 2000;
    // uint internal privateMoney = 2000;
    
    // external 不能修饰属性
    // uint external privateMoney = 2000;
    
    
    uint money = 10000;
    
    function noSmoking() view returns(string){
        return "I'm not somking";
    }
    
}


contract Son is Father{
    
    function getMoney() view returns(uint){
        return money;
    }
    // 爸爸的私房钱 我们没有办法继承 直接编译报错
    function getPrivateMoney() view returns(uint){
        return privateMoney;
    }
}

上述的案例,我们可以看到,子合约是没有办法继承父合约的私有属性变量的。这里我们用到了修饰符private表示私有的。这里我们把关于继承特性的修饰符做一个总结.

  • 如果属性不加上任何修饰符,是可以被继承的。
  • 如果使用public修饰成员属性,是可以被继承的
  • 如果使用internal修饰成员属性,是可以被继承的
  • external 不支持修复成员属性
  • 如果使用private 修饰成员属性,是不能够被继承的。

上面我们介绍了合约属性的继承中权限,接下来我们看看函数中继承的权限问题吧。

public修饰父合约函数

子合约可以正常调用父合约的函数。

pragma solidity ^0.4.16;


contract Father{

    
    function noSmoking() public view returns(string){
        return "I'm not somking";
    }
    
}


contract Son is Father{
    
    function test() public view returns(string){
        return noSmoking();
    }
    
}
private修饰父合约函数

编译不通过。

pragma solidity ^0.4.16;


contract Father{

    
    function noSmoking() private view returns(string){
        return "I'm not somking";
    }
    
}


contract Son is Father{
    
    function test() public view returns(string){
        return noSmoking();
    }
    
}
internal修饰父合约函数

父函数不可见,子合约可以调用

pragma solidity ^0.4.16;


contract Father{

    
    function noSmoking() internal pure returns(string){
        return "I'm not somking";
    }
    
}


contract Son is Father{
    
    function test() public pure returns(string){
        return noSmoking();
    }
    
}
external修饰父合约函数

编译报错。

pragma solidity ^0.4.16;


contract Father{

    
    function noSmoking() external pure returns(string){
        return "I'm not somking";
    }
    
}


contract Son is Father{
    
    function test() public pure  returns(string){
        return this.noSmoking();
    }
    
}

关于继承中的权限,内容也相对简单,大家在平时使用时,其实只需要用 publicprivate就可以满足大部分需求了。

面向区块链编程,构建可信社会。我们下节再见。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值