solidity 以太坊智能合约语言(六)

1、solidity中的变量定义

在solidity中,变量声明后都会默认赋值为初始值。

  • 对于引用类型,声明后还需要显示分配内存。
  • 对于映射类型,不显示初始化也可以使用,不过里面没有任何值。
  • 枚举如果没有初始化,默认取顺位第一个值;
  • 结构体没有初始化,里面所有变量是初始值。

非常关键的一点:变量无论在函数什么位置定义,作用域都是这个函数

2、solidity中的delete操作符

solidity中因为区块是一种公共资源,为了避免滥用,可以用delete操作符释放空间,可能还会返回一些gas。

2.1 删除基本类型,会将基本类型设置为初始值,

  • bool 初始值是false
  • uint是0
  • address和变长数组是0x0
  • string是空串
  • 枚举将会被置为序号为0的值
  • 函数类型不能删除
  • 结构体,删除后结构体中的类型会恢复为初始值,如果结构体中有映射,会直接跳过
  • 映射,直接删除会报错,但是可以指定删除某一项
  • 定长数组,直接删除会将数组内所有元素置为初始值。如果指定删除数组的某一个元素,只会把当前元素置为初始值,其余不变

2.2 删除注意事项

由于本身并未提供对映射这样的大对象的清理,所以存储并遍历它们来进行清理,显得特别消耗gas。一种实践就是能复用就复用,一般不主动清理。

删除本质是对一个变量赋初值。所以我们删除storage的引用时会报错,因为storage的引用并没有自己已分配的存储空间,所以不能对storage的引用直接赋初值。

3、合约中的继承

继承的关键字是is,继承也支持传参。继承中,不允许出现相同的函数名,事件名,修改器名,或者互相重名。子类允许重写函数,但是不允许重写返回函数签名。

由于继承的实现方案是代码拷贝,所以合约继承后,部署到网络时,将变成一个合约。代码将从父类拷贝到子类中。

在继承链中,如果出现函数重名,最终使用的是继承链上最远继承的那个。

pragma solidity ^0.4.0;

contract Base1{
  function data() returns(uint){
    return 1;
  }
}

contract Base2{
  function data() returns(uint){
    return 2;
  }
}

contract MostDerived1 is Base1, Base2{
  function call() returns(uint){
    return data();
  }
}
contract MostDerived2 is Base2, Base1{
  function call() returns(uint){
    return data();
  }
}

例子中,MostDerived1将会返回2,MostDerived2将会返回1.

在solidity中,可以显示指定调用父合约的方法。

super关键字?

在Solidity中,允许多继承,你可以同时继承多个合约。实现多继承的编程语言需要解决几个问题,其中之一是菱形继承问题又称钻石问题。

此外,继承由于遵循最远继承原则,所以继承的顺序也很关键。

你可能感兴趣的:(区块链——智能合约)