智能合约的封装,继承和多态 / 学习智能合约#9

智能合约的封装,继承和多态 / 学习智能合约#9

智能合约

智能合约的封装,继承和多态,之所以这么提,是因为智能合约和面向对象实在是太像了,两者几乎是长得一模一样!

面向对象三大特性是:封装,继承,多态

所谓封装:
也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。

所谓继承:
是指可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。

所谓多态:
就是指一个类实例的相同方法在不同情形有不同表现形式。多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。

对比着看:

  1. 智能合约的封装:
    关键词:public private external internal
    可以访问,可以继承的是public external
    只能内部访问,不可继承的是private internal

  2. 智能合约的继承:
    contract ERC20 is ERC20Interface{}
    关键词: is

  3. 智能合约的多态
    多态稍显复杂点,在智能合约中是通过抽象合约来实现类似多态的功能。一个抽象合约被多个合约继承,对其方法可以有不同的实现。
    注意:两个合约间只是方法的实现,不会相互改变状态变量等。
    来个合约详情的例子:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    pragma solidity >0.4.23 <0.7.0;

    abstract contract AbstractContract {
    function add(uint m, uint n) public virtual returns(uint);
    function mul(uint m, uint n) public pure returns(uint) {
    return m * n;
    }
    }

    contract MyContract is AbstractContract {
    function add(uint m, uint n) public override returns(uint) {
    return m + n;
    }
    }


    contract MyContract2 is AbstractContract {
    function add(uint m, uint n) public override returns(uint) {
    return (m + n) * 2;
    }
    }


    contract NewContract {
    AbstractContract c = new MyContract2();
    //合约的实例化以实现不同合约中的方法
    function calc(uint m, uint n) public returns(uint) {
    return c.add(m,n) + c.mul(m,n);
    }
    }

总体来讲,智能合约的功能还是比较丰富的,不过局限于存储的区块链,有很多特别细致的讲究,以至于学起来过于复杂。但是为了得到全网一致性的共识,有些性能被牺牲了,这也是可以理解的。


This page is synchronized from the post: ‘智能合约的封装,继承和多态 / 学习智能合约#9’

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×