0

我刚刚开始使用 Solidity。对于这个问题,我认为如果我首先陈述我对继承的理解很有用:如果合同 B 继承自合同 A(即在 contractB.sol 我们有

contract B is A {...
}

那么合约 B 将可以访问合约 A 的功能。

另外,据我了解,如果我想使用其他人的其他合同中的某些功能,我的代码中会包含以下内容:

contract someoneElsesInterface {
     function someFunction() returns(something) }

contract myContract {
     someoneElsesInterface someoneElsesContract = someonElsesInterface(address);
     value = someoneElsesContract.someFunction();
}

我在尝试实施 ERC721 标准时出现了困惑。首先,我必须将 erc721.sol 文件保存在我的目录中;该文件包含

contract ERC721 {
  event Transfer(address indexed _from, address indexed _to, uint256 indexed _tokenId);
  event Approval(address indexed _owner, address indexed _approved, uint256 indexed _tokenId);

  function balanceOf(address _owner) external view returns (uint256);
  function ownerOf(uint256 _tokenId) external view returns (address);
  function transferFrom(address _from, address _to, uint256 _tokenId) external payable;
  function approve(address _approved, uint256 _tokenId) external payable;
}

然后在一个单独的文件中,我必须继承ERC721合约,然后定义balanceOf、ownerOf、transferFrom、approve这四个函数的内容;以及发出 Transfer 和 Approve 事件。所以以下内容:

contract myContract is ERC721 {
     function balanceOf...
     function ownerOf...
     function transferrFrom...
     ...
}

这是我不明白的:为什么 ERC721 不是从 myContract 继承的,因为我们在 myContract 中定义函数,并像上面的示例一样在 ERC721 中声明函数名称和返回值?当我们已经在 myContract 中定义了所有功能内容时,ERC721 合约和让 myContract 继承自 ERC721 的意义何在?在前端工作时,我是从 myContract 还是从 ERC721 调用函数?

我希望我的问题很清楚,如果不是,我可以在评论中澄清。预先感谢您的回复。

4

1 回答 1

2

首先,您不继承接口,而是实现它。在接口契约中,你不定义,你声明. 您声明功能、输入和输出。

接口不能从具体(实际)合同继承。只有接口可以相互继承。如果你想一想,具体合约比接口包含更多的信息,接口如何从具体合约继承?

一般来说,接口是用户和程序之间的契约,Solidity 也是如此。它们向用户保证一定的功能。通过实施 ERC721,您声明您的合约与 ERC721 兼容。正因为如此,用户不需要知道你的合约的实现细节,相反,他们可以使用 ERC721 接口调用你的合约。

考虑以下:

ContractA { ... }

对比

ContractB is ERC721 { ... }

假设两个合约都实现了 ERC721 功能。

为了能够调用 ContractA 进行 ERC721 交互,我必须导入它的 ABI 并验证它是否兼容。例如,我会这样称呼它:

ContractA(ADDRESS_OF_CONTRACT_A).safeTransferFrom(...)

另一方面调用ContractB,我只需要ERC721 ABI,我不需要知道ContractB。所以我可以这样做:

ERC721(ADDRESS_OF_CONTRACT_B).safeTransferFrom(...)

在我结束之前,我想强调一下,您的问题实际上不是关于 Solidity 或智能合约,而是关于面向对象的编程、继承和接口。我建议您阅读更多内容以更好地理解该概念。

于 2021-09-20T11:27:01.887 回答