01 Solidity面向对象编程基础

2018年5月29日 1 作者 jacky

介绍

Solodity 合约的语法和面向对象编程语言非常相似,一个合约有我们能够调用的方法(函数) 和 能够存储数据个读取数据的属性(状态变量)

例子:

小结

部署合约的时候,因为要往区块链写入数据,需要矿工进行验证,所有需要花费一些Gas奖励给矿工,还有当我们每次调用increment方法的时候,也是属于写入数据,同时需要花费一些gas,但是调用getCount 方法时只是从区块链读取数据,无需验证,读取数据是无需花费gas的。其中函数Person()和kill()分别为合约的构造函数和析构函数。

Solidity 合约中属性和行为的访问权限

属性的访问权限
属性:状态属性

在属性中,有3个权限
public internal private
internal 是默认的属性

其中访问权限的大小排序是:
public > internal > private

总结:private 和 internal 属性都不能被外部访问,如果属性是public 会自动生成Get函数。
但是最后是以Get函数为基准的,会把默认生成的get函数覆盖掉.比如上面的weight属性,会生成一个get函数。

方法/行为访问权限
方法/行为:合约里面的函数
方法的属性默认是public类型
但是只有public 是可以正常调用的

总结
属性默认权限为internal,只有public类型的属性才可能提供外部访问。

函数的权限默认是public类型,public类型的函数可供外部访问,而internal和private类型的函数不能够通过指针访问,哪怕是内部通过this访问都会报错的,在合约内部访问,我们可以直接访问函数就可以了

备注:不管是属性还是方法,只有是public,才可以通过合约地址进行访问,合约内部的this就是当前合约的地址。在合约内部如果访问internal和private类型的属性或者是函数,直接访问即可,不要试图通过this去访问。

合约的单继承与多继承

合约是可以多继承的,继承的关键字是 is
继承的方法只能是public,属性的继承只能继承 internal 和 public

合约函数的重写

跟java中的方法的重写一样的

值类型 和 引用类型

值类型

引用类型

name是通过构造函数传入的,我们可以在Crete的时候传入我们需要初始化的数据

创建完成后

调用f()函数

可以看见明确修改了引用类型的值

总结
我们默认传递的类型是memory,也就是值传递,如果需要改变为引用传递,需要使用关键字storage,并且使用了storage方法必须是internal或者是private类型的(只能是内部调用)。也就是说需要调用另一个方法去调用这个改变值的方法。

参考:
solidity在线文档