solidity的高阶语法
1.合约
Solidity 中的合约类似于 C++ 中的类。 合约具有以下属性。
Constructor − 使用 constructor 关键字声明的特殊函数,每个合约将执行一次,并在创建合约时调用。
State Variables − 每个合约的变量用于存储合约的状态。
Functions − 每个合约的函数可以修改状态变量以改变合约的状态。
可见性量词
以下是合约的函数/状态变量的各种可见性量词。
external − 外部函数旨在由其他合约调用。 它们不能用于内部呼叫。 要在合约中调用外部函数,需要调用 this.function_name() 。 状态变量不能标记为外部。
public − 公共函数/变量可以在外部和内部使用。 对于公共状态变量,Solidity 会自动创建一个 getter 函数。
internal − 内部函数/变量只能在内部使用或由派生合约使用。
private − 私有函数/变量只能在内部使用,甚至不能在派生合约中使用。
示例
pragma solidity ^0.5.0;contract C {//private state variableuint private data;//public state variableuint public info;//constructorconstructor() public {info = 10;}//private functionfunction increment(uint a) private pure returns(uint) { return a + 1; }//public functionfunction updateData(uint a) public { data = a; }function getData() public view returns(uint) { return data; }function compute(uint a, uint b) internal pure returns (uint) { return a + b; } } //External Contract contract D {function readData() public returns(uint) {C c = new C();c.updateData(7); return c.getData();} } //Derived Contract contract E is C {uint private result;C private c;constructor() public {c = new C();} function getComputedResult() public { result = compute(3, 5); }function getResult() public view returns(uint) { return result; }function getData() public view returns(uint) { return c.info(); } }
对于 E.getCompulatedResult() 和 E.getResult() 显示
输出
0: uint256: 8
2.继承
继承是扩展合约功能的一种方式。 Solidity 支持单继承和多重继承。 以下是主要亮点。
派生合约可以访问所有非私有成员,包括内部方法和状态变量。 但使用这个是不允许的。
如果函数签名保持不变,则允许函数重写。 如果输出参数不同,编译将失败。
我们可以使用 super 关键字或使用超级合约名称来调用超级合约的函数。
在多重继承的情况下,使用 super 的函数调用优先考虑最派生的契约。
示例
pragma solidity ^0.5.0;contract C {//private state variableuint private data;//public state variableuint public info;//constructorconstructor() public {info = 10;}//private functionfunction increment(uint a) private pure returns(uint) { return a + 1; }//public functionfunction updateData(uint a) public { data = a; }function getData() public view returns(uint) { return data; }function compute(uint a, uint b) internal pure returns (uint) { return a + b; } } //Derived Contract contract E is C {uint private result;C private c;constructor() public {c = new C();} function getComputedResult() public { result = compute(3, 5); }function getResult() public view returns(uint) { return result; }function getData() public view returns(uint) { return c.info(); } }
3.构造函数
构造函数是使用constructor关键字声明的特殊函数。 它是一个可选函数,用于初始化合约的状态变量。 以下是构造函数的主要特征。
一个合约只能有一个构造函数。
构造函数代码在合约创建时执行一次,用于初始化合约状态。
执行构造函数代码后,最终代码将部署到区块链。 该代码包括公共函数和可通过公共函数访问的代码。 构造函数代码或仅由构造函数使用的任何内部方法不包含在最终代码中。
构造函数可以是公共的,也可以是内部的。
内部构造函数将合约标记为抽象。
如果没有定义构造函数,则合约中存在默认构造函数。
pragma solidity ^0.5.0;contract Test {constructor() public {} }
如果基础合约有带参数的构造函数,每个派生合约都必须传递它们。
基础构造函数可以直接使用以下方式初始化 −
pragma solidity ^0.5.0;contract Base {uint data;constructor(uint _data) public {data = _data; } } contract Derived is Base (5) {constructor() public {} }
基本构造函数可以使用以下方式间接初始化 −
pragma solidity ^0.5.0;contract Base {uint data;constructor(uint _data) public {data = _data; } } contract Derived is Base {constructor(uint _info) Base(_info * _info) public {} }
不允许直接和间接方式初始化基础合约构造函数。
如果派生合约未将参数传递给基础合约构造函数,则派生合约将变得抽象。