Soildity之合约继承(6)

Soildity支持继承和多重继承,跟C++类似。由于Soildity的这个属性,合约可以继承。当一个通过继承产生的合约被部署到区块链上时,实际上区块链只创建了一个合约,所有基类合约的代码都会在子类合约中有一份拷贝,下面将一一介绍。

1. 合约的继承
下面展示一个合约继承的例子,源码如下:

contract owned{
	function owned(){
		owner = msg.sender;
		//与合约同名的函数为构造器,每个合约都允许存在构造器,有且只能有一个,不允许重载
		//构造器将在合约创建时,自动执行一次,用于初始化一些配置
	}
	address owner;
}

contract mortal is owned{
    //is是合约继承的关键字
	function kill(){
		if(msg.sneder == owner)
			selfdestruct(owner);
			//销毁合约,并把以太币全部转给owner地址
	}
}

contract Base1 is mortal{
	function kill(){
		super.kill();
		//super来指向上级合约并调用相关函数
	}
}

contract Base2 is mortal{
	function kill(){
		super.kill();
	}
}

//合约的多重继承
contract Final is Base2,Base1{
	...
}

从上述可以看到,mortal是owned的派生合约,Base1和Base2是mortal的派生合约,Final是Base2和Base1的派生合约。
Final派生自两个合约Base2和Base1,这两个合约名的顺序决定继承重写的先后顺序,从左到右依次继承。由于合约中的函数都是虚函数,这意味着除非指定合约名,否则调用的都是最后派生的函数。

2. 合约构造函数的赋值
通过上面的介绍可以了解到,每个合约都可有一个构造函数,在合约第一次运行时仅运行一次,对一些关键的配置信息进行初始化,那么在合约的继承中,怎么对上级合约的构造函数的参数进行赋值呢?下面将为大家介绍两种主要的赋值方式。
第一种直接在继承列表中指定,示例代码如下:

contract Base{
	uint x;
	function Base (uint _x){
		x = _x;
	}
}

contract Final is Base(7){
	...
}

第二种在定义派生类构造函数时提供,示例代码如下:

contract Base{
	uint x;
	function Base (uint _x){
		x = _x;
	}
}

contract Final is Base{
	function Final(uint _y)  Base(_y + _y){
		...
	}
	...
}

3. 抽象合约
抽象合约是指一个合约只要有函数的声明而没有函数的具体实现,这样的合约被称为抽象合约。抽象合约不能被正确编译,但可以被其他合约作为基类合约被继承,这样派生出来的合约可以正确编译并引用。示例代码如下:

contract Base{
	uint x;
	function Base (uint _x){
		x = _x;
	}
   
   function add(uint x,uint y) returns(uint z);
}

contract Final is Base{
	 function add(uint x,uint y) returns(uint z){
	 	z = x + y;
	 }
}

4. 接口 interface
接口类似于抽象合约,但是它们不能实现任何函数。还有进一步的限制:
a.无法继承其他合约或接口
b.无法定义构造函数
c.无法定义变量
d.无法定义结构体
e.无法定义枚举
接口由它们自己的关键字interface表示,示例代码如下:

pragma solidity ^0.4.11;

interface Token {
    function transfer(address recipient, uint amount) public;
}

就像继承其他合约一样,合约可以继承接口。

5. 合约的创建 new
使用关键字 new 可以创建一个新合约。待创建合约的完整代码必须事先知道,因此递归的创建依赖是不可能的。其示例代码如下:

pragma solidity ^0.4.0;

contract D {
    uint x;
    function D(uint a) public payable {
        x = a;
    }
}

contract C {
    D d = new D(4); // 将作为合约 C 构造函数的一部分执行

    function createD(uint arg) public {
        D newD = new D(arg);
    }

    function createAndEndowD(uint arg, uint amount) public payable {
                //随合约的创建发送 ether
        D newD = (new D).value(amount)(arg);
    }
}

6. 合约的引用 import
Soildity跟GO语言一样具有import关键字,支持引用其他的.sol文件。其引用可规则如下:

import "filename";
//此语句将从 “filename” 中导入所有的全局符号到当前全局作用域中

import * as symbolName from "filename";
//创建一个新的全局符号 symbolName,其成员均来自 "filename" 中全局符号

import {symbol1,symbol2 as alias1, alias2} from "filename";
//创建新的全局符号 alias1 和 alias2,分别从 "filename" 引用 symbol1 和 symbol2

以上是合约的基本知识点,在实际运用中,最重要的是在主链中通过合约调用其他部署在主链的合约进行相应的操作,后续我将介绍这方面的知识点。
对于合约这一块,推荐一个总结比较全的博文:https://blog.csdn.net/qq_35197457/article/details/79855637

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值