Soildity之合约继承(6)

2024-05-11 06:58
文章标签 继承 合约 soildity

本文主要是介绍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 {//随合约的创建发送 etherD 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

这篇关于Soildity之合约继承(6)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/978823

相关文章

JavaSE——封装、继承和多态

1. 封装 1.1 概念      面向对象程序三大特性:封装、继承、多态 。而类和对象阶段,主要研究的就是封装特性。何为封装呢?简单来说就是套壳屏蔽细节 。     比如:对于电脑这样一个复杂的设备,提供给用户的就只是:开关机、通过键盘输入,显示器, USB 插孔等,让用户来和计算机进行交互,完成日常事务。但实际上:电脑真正工作的却是CPU 、显卡、内存等一些硬件元件。

七、Maven继承和聚合关系、及Maven的仓库及查找顺序

1.继承   2.聚合   3.Maven的仓库及查找顺序

OOP三个基本特征:封装、继承、多态

OOP三个基本特征:封装、继承、多态 C++编程之—面向对象的三个基本特征 默认分类 2008-06-28 21:17:04 阅读12 评论1字号:大中小     面向对象的三个基本特征是:封装、继承、多态。     封装 封装最好理解了。封装是面向对象的特征之一,是对象和类概念的主要特性。   封装,也就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信

c++ 类的继承详解

在 C++ 中,类的继承是一种面向对象编程(OOP)的特性,允许创建一个新的类(派生类)从一个已有的类(基类)派生。通过继承,派生类可以重用基类的属性和行为,并且可以扩展或修改这些行为。继承是一种代码重用和扩展的机制,使得派生类能够继承基类的特性并添加或修改特性。 1. 继承的基本语法 class Base {// 基类的成员};class Derived : public Base {//

浅谈NODE的NPM命令和合约测试开发工具HARDHAT

$ npm install yarn -g  # 将模块yarn全局安装 $ npm install moduleName # 安装模块到项目目录下 默认跟加参数 --save 一样 会在package文件的dependencies节点写入依赖。   $ npm install -g moduleName # -g 的意思是将模块安装到全局,具体安装到磁盘哪个位置,要看 npm root -g

C++ 第8章 继承

继承(Inheritance)是面向对象程序设计中软件重用的关键技术。 8.1 类之间的关系 一个大的应用程序,通常由多个类构成,类与类之间互相协同工作。 class Vehicle{int wheels;double weight;double loading;public:void initialize(int in_wheels, double in_weight);int get

C++ 菱形继承与虚拟继承的详解与代码示例

在C++中,多重继承虽然强大,但也会带来不少问题。特别是当继承链中出现菱形继承时,容易导致基类的重复实例化。本文将深入讨论菱形继承的问题,并详细解释如何通过虚拟继承来解决它。同时,给出一个简单的代码示例,并逐步解析输出结果。 什么是菱形继承? 菱形继承是指在多重继承中,同一个基类被多个派生类继承,而这些派生类又被另一个类继承,最终形成菱形结构,如下图所示: A/ \B C\ /D

C++_继承详解

继承的概念 继承(inheritance)机制是面向对象程序设计使代码可以复用的重要的手段,它允许程序员在保持原有类特性的基础上进行扩展,增加功能。继承呈现了面向对象程序设计的层次结构,之前我们接触的复用都是函数复用,今天我们所讨论的继承是类设计层次的复用。 子类继承父类的成员后,父类的 成员函数 和 成员变量 都会变成子类的一部分,其中父类的成员函数与子类的成员函数使用的是同一个函数(构造

【C++】C++的输入输出、循环、条件、字符串、数组、类、继承的使用实例

本文介绍C++的基本使用,用一个程序说明的基本运用,当然C++中的指针与运算符的重载这些特色东西还没有涉及,只是把编程中最基本的东西讲述一次, 与《【Python】Windows版本的python开发环境的配置,Helloworld,Python中文问题,输入输出、条件、循环、数组、类》(点击打开链接)是姊妹篇,据说这堆东西出书的话能写很多很多页,上课的话能上大半学期,真是醉了。 以下程