【CryptoZombies - 1 Solidity 教程】012 继承(Inheritance)和 引用 (import)

一、前言

看了一些区块链的教程,论文,在网上刚刚找到了一个项目实战,CryptoZombies。

如果你想了解更多有关于机器学习、深度学习、区块链、计算机视觉等相关技术的内容,想与更多大佬一起沟通,那就扫描下方二维码加入我们吧!

二、 继承(Inheritance)

1、讲解

继承是面向对象的一个很重要的一个功能,通过继承,我们可以让我们的代码更加简单,结构也更加好,相关关系也更加明确。在solidity中也有继承(Inheritance)。

例如下面的示例,我们创建一个小狗的合约,并创建一个新的狗宝宝合约来继承它。

contract Dog {
    function speak() public returns (string) {
        return "woof woof";
    }

}

contract BabyDog is Dog {
    function eat() public returns (string) {
        return "milk";
    }

}

由于 BabyDog 是从 Dog 那里 inherits(继承) 过来的。 这意味着当你编译和部署了 BabyDog,它将可以访问speak()eat() 和其他在 Dog 中定义的公共函数。

这可以用于逻辑继承(比如表达子类的时候,Cat 是一种 Animal)。 但也可以简单地将类似的逻辑组合到不同的合约中以组织代码。

2、实战

1.要求

在 ZombieFactory 下创建一个叫 ZombieFeeding 的合约,它继承自 `ZombieFactory 合约。

2.代码

pragma solidity >=0.5.0 <0.6.0;

contract ZombieFactory {

    event NewZombie(uint zombieId, string name, uint dna);

    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;

    struct Zombie {
        string name;
        uint dna;
    }

    Zombie[] public zombies;

    mapping (uint => address) public zombieToOwner;
    mapping (address => uint) ownerZombieCount;

    function _createZombie(string memory _name, uint _dna) private {
        uint id = zombies.push(Zombie(_name, _dna)) - 1;
        zombieToOwner[id] = msg.sender;
        ownerZombieCount[msg.sender]++;
        emit NewZombie(id, _name, _dna);
    }

    function _generateRandomDna(string memory _str) private view returns (uint) {
        uint rand = uint(keccak256(abi.encodePacked(_str)));
        return rand % dnaModulus;
    }

    function createRandomZombie(string memory _name) public {
        require(ownerZombieCount[msg.sender] == 0);
        uint randDna = _generateRandomDna(_name);
        _createZombie(_name, randDna);
    }

}

// Start here
contract ZombieFeeding is ZombieFactory {

}

三、 引用(import)

1、讲解

这里的引用和python中的引用是一样的,我们可以引用我们写的其他文件中的合约或者函数,因为我们不可能把所有的代码都写在一个文件中。

例如下面的示例,我们在同文件夹下有一个sol文件:mySol.sol,现在我们想在我们这个文件中来引用它。引用的格式如下:

import "./mySol.sol";

引用写在版本号下面,写在其他代码上面,所以在一个新的sol文件中,我们的引用写在如下位置中:

扫描二维码关注公众号,回复: 9258682 查看本文章
pragma solidity ^0.4.19;

import "./mySol.sol";

contract newSol {
    
}

2、实战

1.要求

建立了一个多文件架构,并用 import 来读取来自另一个文件中合约的内容,将 zombiefactory.sol 导入到我们的新文件 zombiefeeding.sol 中。

其中zombiefactory.sol 文件内容如下:

pragma solidity >=0.5.0 <0.6.0;

contract ZombieFactory {

    event NewZombie(uint zombieId, string name, uint dna);

    uint dnaDigits = 16;
    uint dnaModulus = 10 ** dnaDigits;

    struct Zombie {
        string name;
        uint dna;
    }

    Zombie[] public zombies;

    mapping (uint => address) public zombieToOwner;
    mapping (address => uint) ownerZombieCount;

    function _createZombie(string memory _name, uint _dna) private {
        uint id = zombies.push(Zombie(_name, _dna)) - 1;
        zombieToOwner[id] = msg.sender;
        ownerZombieCount[msg.sender]++;
        emit NewZombie(id, _name, _dna);
    }

    function _generateRandomDna(string memory _str) private view returns (uint) {
        uint rand = uint(keccak256(abi.encodePacked(_str)));
        return rand % dnaModulus;
    }

    function createRandomZombie(string memory _name) public {
        require(ownerZombieCount[msg.sender] == 0);
        uint randDna = _generateRandomDna(_name);
        _createZombie(_name, randDna);
    }

}

2.代码

pragma solidity >=0.5.0 <0.6.0;

// put import statement here
import "./zombiefactory.sol";

contract ZombieFeeding is ZombieFactory {

}
发布了250 篇原创文章 · 获赞 504 · 访问量 51万+

猜你喜欢

转载自blog.csdn.net/shuiyixin/article/details/104375828