Solidity之合约的引入与继承和重载

377 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第8天,点击查看活动详情

前言

Solidity 合约类似于面向对象语言中的类。合约中有用于数据持久化的状态变量,和可以修改状态变量的函数。 调用另一个合约实例的函数时,会执行一个 EVM 函数调用,这个操作会切换执行时的上下文,这样,前一个合约的状态变量就不能访问了。

合约的引入

如果我们的合约需要部署很多个给不同的人使用,那么我们就可以使用一个工厂模式的概念,把基础合约定义好,在增加一个工厂合约,用来生产我们的子合约。

如下是一个工厂合约 合约的引入关键字是import,这个合约里我们需要引入SimpleStorage.sol合约来使用,那么只需要import '合约位置'即可导入

// SPDX-License-Identifier: MIT 

pragma solidity ^0.8.0;

import "./SimpleStorage.sol"; 

contract StorageFactory {
    
    SimpleStorage[] public simpleStorageArray;
    
    function createSimpleStorageContract() public {
        SimpleStorage simpleStorage = new SimpleStorage();
        simpleStorageArray.push(simpleStorage);
    }
    
    function sfStore(uint256 _simpleStorageIndex, uint256 _simpleStorageNumber) public {
        // Address 
        // ABI 
        // SimpleStorage(address(simpleStorageArray[_simpleStorageIndex])).store(_simpleStorageNumber);
        simpleStorageArray[_simpleStorageIndex].store(_simpleStorageNumber);
    }
    
    function sfGet(uint256 _simpleStorageIndex) public view returns (uint256) {
        // return SimpleStorage(address(simpleStorageArray[_simpleStorageIndex])).retrieve();
        return simpleStorageArray[_simpleStorageIndex].retrieve();
    }
}

createSimpleStorageContract 方法表示创建合约,每调用一次都会创建一个新的合约,并存储在我们的合约数组里。

sfStore 方法表示存储某个数字到对应的合约里。

sfGet 表示通过对应的合约索引,来获取到对应存储的值。

我们这里把工厂合约部署一下,如图所示成功

image.png

点击createSimpleStorageContract 方法会马上创建一个合约,

image.png 然后获取数组的第一个元素,即打印出了合约地址,即第一个的合约地址显示出来。

接着我们往这个第一个合约里存储值

image.png 点击transact,就执行

image.png

可以看到sfGet方法能得到对应的值了。

继承和承载

合约中继承的关键字是is

// SPDX-License-Identifier: MIT

pragma solidity 0.8.8;

import "./SimpleStorage.sol";

contract ExtraStorage is SimpleStorage {
    function store(uint256 _favoriteNumber) public override {
        favouriteNumber = _favoriteNumber + 5;
    }
}

这里写了ExtraStorage 合约继承了 SimpleStorage合约,这时候编译合约,会出现

image.png 表示函数如果需要重载,要声明对应的关键字,override表示这个函数是重载的函数,要想对应的函数可以给子合约重载,那么父合约的函数应该声明为 virtual,如下

image.png

这样编译才会正常通过,即完成了store函数的重载。

总结

正常开发来说,合约肯定是分成了很多文件,互相引入,因此要知道本地合约如何引入,还可以直接通过github引入,同时继承和重载也是常用的。