首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在第一个代码块而不是在第二个代码块中实现线性化?

如何在第一个代码块而不是在第二个代码块中实现线性化?
EN

Ethereum用户
提问于 2022-09-15 17:00:38
回答 1查看 27关注 0票数 0

第一个代码块

代码语言:javascript
复制
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Counters.sol";
import 'https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/ERC721URIStorage.sol';
import 'https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol';

contract MyNFT is  ERC721URIStorage, Ownable{
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    constructor() ERC721("Snake", "S"){
    }

    function MintNFT(address player, string memory tokenURI) public returns (uint256) {
        _tokenIds.increment();

        uint256 newItemId = _tokenIds.current();
        _mint(player, newItemId);
        _setTokenURI(newItemId, tokenURI);

        return newItemId;
    }

    function NumberOfNFT() public view returns(uint){
        return _tokenIds.current();
    }
}

第二代码块

代码语言:javascript
复制
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/ERC721.sol";
import "https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Counters.sol";
import 'https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC721/extensions/ERC721URIStorage.sol';
import 'https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol';

contract MyNFT is   ERC721("Snake", "S"),ERC721URIStorage, Ownable{
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    constructor(){
    }

    function MintNFT(address player, string memory tokenURI) public returns (uint256) {
        _tokenIds.increment();

        uint256 newItemId = _tokenIds.current();
        _mint(player, newItemId);
        _setTokenURI(newItemId, tokenURI);

        return newItemId;
    }

    function NumberOfNFT() public view returns(uint){
        return _tokenIds.current();
    }
}
EN

回答 1

Ethereum用户

发布于 2022-09-16 00:40:50

在solidity中,有名为虚拟和<>重写的函数修饰符。

这意味着,当您提到一个函数是虚拟的时,您是在向编译器暗示该函数将在派生契约中被覆盖。这是编译器所期待的。

在第一个代码块中,您只导入erc721URIStorage。而ERC721URIStorage合同则是ERC721合同。

因此,当您试图在第二个代码块中两次导入ERC721契约时,它要求您使用相同的函数名覆盖虚拟函数。

如果这样做,错误将是:

如果您查看图片,错误会说:

TypeError:派生契约必须覆盖函数"_burn“。两个或多个基类定义具有相同名称和参数类型的函数。TypeError:派生契约必须覆盖函数"tokenURI“。两个或多个基类定义具有相同名称和参数类型的函数。

当您两次继承erc721契约时,您将有两个_burn和tokenURI函数。因此,在任何编程语言中都不允许有两个具有相同名称和参数的函数(编译器抛出错误),而且它们之上是虚拟函数。

告诉我是否有用!

你可以在这里读到更多关于继承的内容。

票数 1
EN
页面原文内容由Ethereum提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://ethereum.stackexchange.com/questions/135700

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档