1703876775
区块链项目开发指南 3.9.4 继承
1703876776
1703876777
Solidity通过代码备份(包括多态)支持多重继承(multiple inheritance)。即使一个合约继承自其他多个合约,在区块链上也只创建一个合约,来自父合约(parent contract)的代码总是被复制到最终合约里。示例如下:
1703876778
1703876779
1703876780
1703876781
1703876782
1703876783
1703876784
1703876785
1.super关键字
1703876786
1703876787
super关键字用于引用最终继承链中的下一个合约,示例如下:
1703876788
1703876789
1703876790
1703876791
1703876792
其中,引用sample6合约的最终继承链是sample6、sample5、sample4、sample2、sample3和sample1。继承链始于衍生最充分的合约,终于衍生最不充分的合约。
1703876793
1703876794
2.抽象合约
1703876795
1703876796
仅包含函数原型而不包含函数实现的合约称为抽象合约(abstract contract)。这些合约不能被编译(即使包含实现函数和非实现函数)。如果一个合约继承自抽象合约且不重写并实现所有非实现函数,那么它自己也是抽象的。
1703876797
1703876798
抽象合约仅在创建编译器已知的接口时提供。这在引用已部署的合约和调用其函数时是很有用的。示例如下:
1703876799
1703876800
1703876801
1703876802
1703876803
1703876804
1703876805
1703876807
区块链项目开发指南 3.10 库
1703876808
1703876809
库类似于合约,但其目的是在一个特定地址只部署一次,且其代码由不同合约反复使用。这意味着如果调用库函数,其代码在调用合约(calling contract)中执行,也就是说,this指向调用合约,特别是来自调用合约的storage可以被访问。由于库是源代码中独立的一部分,它只能访问调用合约的状态变量,如果这些变量是显式的(否则无法命名这些变量)。
1703876810
1703876811
库没有状态变量——它们不支持继承,也不能接收以太币。库可以包含结构类型(struct)和枚举类型(enum)。
1703876812
1703876813
一旦在区块链中部署Solidity库,任何知道其地址和源代码(只知道原型或者知道完整实现)的人都可以使用它。Solidity编译器需要有源代码,这样能确保所欲访问的方法在库中真实存在。示例如下:
1703876814
1703876815
1703876816
1703876817
1703876818
不能在合约源代码中添加库地址,而是需要在编译时向编译器提供库地址。
1703876819
1703876820
库有许多使用示例。两个主要的示例如下:
1703876821
1703876822
·如果有许多合约,它们有一些共同代码,则可以把共同代码部署成一个库。这将节省gas,因为gas也依赖于合约的规模。因此,可以把库想象成使用其合约的基础合约。使用基础合约(而非库)切分共同代码不会节省gas,因为在Solidity中,继承通过复制代码工作。由于库被当作基础合约,库里面带有内部可视性的函数被复制给使用它的合约;否则,库里面带有内部可视性的函数不能被使用这个库的合约调用,因为这需要外部调用,而带有内部可视性的函数不能通过外部调用被调用。此外,库里的structs和enums被复制给使用这个库的合约。
1703876823
[
上一页 ]
[ :1.703876774e+09 ]
[
下一页 ]